約20,000行のテーブルがあります。すべて正常に動作しますが、クエリの 1 つが約 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 に減りますが、クエリの実行時間は依然として過剰です。今では珍しいと言わざるを得ません。