【发布时间】:2020-10-25 00:53:44
【问题描述】:
这里是 MySQL 菜鸟。
我正在尝试将以下语句运行到sakila database
EXPLAIN SELECT * FROM actor as a
INNER JOIN film_actor as fa on a.actor_id = fa.actor_id
INNER JOIN film AS f ON fa.film_id = f.film_id;
输出是
id| select_type| table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra
'1', 'SIMPLE', 'a', NULL, 'ALL', 'PRIMARY', NULL, NULL, NULL, '200', '100.00', NULL
'1', 'SIMPLE', 'fa', NULL, 'ref', 'PRIMARY,idx_fk_film_id', 'PRIMARY', '2', 'sakila.a.actor_id', '27', '100.00', NULL
'1', 'SIMPLE', 'f', NULL, 'eq_ref','PRIMARY', 'PRIMARY', '2', 'sakila.fa.film_id', '1', '100.00', NULL
actor 表包含 actor_id 作为 PK。
film_actor 表包含actor_id 和film_id 作为复合主键加上idx_fk_film_id 作为film_id 属性的索引。
film 表包含 film_id 作为 PK。
当我查看查询计划时,我注意到type 列下有ALL actor 表,这意味着全表扫描,有谁知道为什么MySQL 没有使用@987654336 上的索引@ 寻找? MySQL 是否按输出顺序执行查询从第一行到最后一行(虽然ids 都是1)?
【问题讨论】:
-
这些表有多大?请注意,MySQL 可能会选择在足够小的表上不使用任何索引。
-
@TimBiegeleisen
actor非常小:只有 200 行。 -
这可能是当时没有使用索引的原因。
-
@TimBiegeleisen 在输出中,为什么
ref列下的sakila.a.actor_id与表fa(film_actor表)在同一行,而不是actor?sakila.a.actor_id应该在actor表中建立索引。我不明白。这是否意味着film_actor_table正在使用actor表的索引? -
sakila.actor_id是sakila.actor.actor_id的缩写。这只是引用此连接列的 database.table.column。