加入不使用索引,索引完全相同

时间:2013-08-24 15:57:39

标签: mysql indexing

我不确定为什么这个查询没有在表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      |         |
+-----------+------------+---------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+

1 个答案:

答案 0 :(得分:0)

world_cities上的city_country_region键具有NULL基数,而要使用它则需要非NULL值。对它进行运行分析应该解决它。

ANALYZE TABLE world_cities

另请查看this post以获取有关NULL基数的更多信息。