0

このクエリがテーブルのインデックスを使用していない理由がわかりません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 に答える