0

有一个大约 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,但查询执行时间仍然过长。现在我必须说它不寻常。

4

0 回答 0