0

我不确定为什么这个查询没有使用 table 上的索引world_cities。索引相同且顺序相同。数据类型具有相同的类型和相同的长度。唯一的区别是key_name.

那么为什么它不使用密钥呢?
如果我运行查询,我会得到:318824 rows in set (2 min 51.30 sec)

这是我所做的:

explain select * from zip_codes zc
inner join world_cities wc on 
    zc.city = wc.city 
    and zc.country = wc.country 
    and zc.region = wc.region;

+----+-------------+-------+------+---------------------+---------------------+---------+---------------------------------------------------------------+---------+-------------+
| id | select_type | table | type | possible_keys       | key                 | key_len | ref                                                           | rows    | Extra       |
+----+-------------+-------+------+---------------------+---------------------+---------+---------------------------------------------------------------+---------+-------------+
|  1 | SIMPLE      | wc    | ALL  | city_country_region | NULL                | NULL    | NULL                                                          | 3173958 |             |
|  1 | SIMPLE      | zc    | ref  | country_region_city | country_region_city | 165     | largedbapi.wc.city,largedbapi.wc.country,largedbapi.wc.region |       1 | Using where |
+----+-------------+-------+------+---------------------+---------------------+---------+---------------------------------------------------------------+---------+-------------+


mysql> show indexes from world_cities where Key_name like '%city%';
+--------------+------------+---------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table        | Non_unique | Key_name            | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+--------------+------------+---------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| world_cities |          1 | city_country_region |            1 | city        | A         |        NULL |     NULL | NULL   | YES  | BTREE      |         |
| world_cities |          1 | city_country_region |            2 | country     | A         |        NULL |     NULL | NULL   | YES  | BTREE      |         |
| world_cities |          1 | city_country_region |            3 | region      | A         |        NULL |     NULL | NULL   | YES  | BTREE      |         |
+--------------+------------+---------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+


mysql> show indexes from zip_codes where Key_name like '%city%';
+-----------+------------+---------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table     | Non_unique | Key_name            | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-----------+------------+---------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| zip_codes |          1 | country_region_city |            1 | city        | A         |      218424 |     NULL | NULL   | YES  | BTREE      |         |
| zip_codes |          1 | country_region_city |            2 | country     | A         |      218424 |     NULL | NULL   | YES  | BTREE      |         |
| zip_codes |          1 | country_region_city |            3 | region      | A         |      436849 |     NULL | NULL   | YES  | BTREE      |         |
+-----------+------------+---------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
4

1 回答 1

0

您在 world_cities 上的 city_country_region 键具有 NULL 基数,而使用它需要非 NULL 键。对其运行分析应该可以解决它。

ANALYZE TABLE world_cities

另请查看这篇文章以获取有关 NULL 基数的更多信息。

于 2013-08-24T16:52:41.603 回答