有一个大约 20,000 行的表。一切正常,但其中一个查询已减慢到大约 5 秒以上。所有表都有主键及其相关索引。还有外键及其相关索引。我已经尝试添加新索引并一点一点地修剪查询,但这并没有太大的区别。我也删除了订单,这确实有帮助,但也只有这么多。我想知道我是否可以得到一双新的眼睛,看看我是否在这里遗漏了什么。
SELECT DISTINCT
t1.my_key,
t2.some_name,
t3.the_weather,
t4.another_value,
t5.hello_world,
t6.last_one
FROM
table_1 AS t1
INNER JOIN table_2 AS t2
ON t1.t2_id_fk = t2.t2_id_pk
INNER JOIN table_3 AS t3
ON t1.t3_id_fk = t3.t3_id_pk
INNER JOIN table_4 as t4
ON t1.t4_id_fk = t4.t4_id_pk
LEFT JOIN table_5 AS t5
ON t1.t5_id_fk = t5.t5_id_pk
LEFT JOIN table_6 AS t6
ON t1.t6_id_fk = t6.t6_id_pk
LEFT JOIN (
table_7 AS t7
INNER JOIN table_8 AS t8
ON (t7.t8_id_fk = t8.t8_id_pk)
)
ON (t1.t1_id_pk = t7.t1_id_fk)
我想知道是什么导致了 using_temporary,尤其是当我为它们都定义了索引时。出于某种原因,当我运行解释时,一切看起来都很好,除了表 2 中的第一个连接值之外,每个都只需要搜索 1 行。在这种情况下,它返回一个 using_temporary 并且每次需要搜索近 3000 行。
更新我向 table_1 添加了一个唯一索引,该索引由其他连接表中的键以相同的顺序组成。Explain 告诉我,这将要搜索的行数从 3000 减少到 294,但查询执行时间仍然过长。现在我必须说它不寻常。