非常に大きなデータセットで動作しているため、評価に時間がかかるSQLクエリがあります。私は、次を発見し、実行時間を改善しようとすると:空のセットを注文するとSQLクエリが非常に遅くなる
次のクエリを実行すると、MySQLサーバが(100secsまで)時間がかかる
SELECT some_data
FROM table
INNER JOIN anothertable
ON (table.value =
anothertable.value)
WHERE (table.parent = 56521
AND table.date >=
'2016-10-19 08:37:45.606947')
ORDER BY table.date DESC
LIMIT 1
だから私はそれをソート一部だと推測しました
SELECT some_data
FROM table
INNER JOIN anothertable
ON (table.value =
anothertable.value)
WHERE (table.parent = 56521
AND table.date >=
'2016-10-19 08:37:45.606947')
LIMIT 1
を上記のクエリは、空のクエリセットに0.45秒とリードをとりますので、多くの実行時間がかかり、私は手動で実行の違いを見るために仕分けに削除クエリの。
WHERE節を評価する前に、私のクエリがWHOLEデータセットを注文したという結論に達しました。そのような動作を防ぐために、クエリをどのように作成する必要がありますか?この現象はなぜ現れますか?
これらは、低速と高速クエリのExplain表は以下のとおりです。
Slow
+----+-------------+-------+------------+--------+------------------------------------------+------------------+---------+------------------------------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+--------+------------------------------------------+------------------+---------+------------------------------+------+----------+-------------+
| 1 | SIMPLE | A | NULL | index | PRIMARY,D4b797d14e515242e7251754c57b7701 | date | 5 | NULL | 1325 | 0.08 | Using where |
| 1 | SIMPLE | B | NULL | eq_ref | PRIMARY | PRIMARY | 4 | value | 1 | 100.00 | NULL |
+----+-------------+-------+------------+--------+------------------------------------------+------------------+---------+------------------------------+------+----------+-------------+
Fast:
+----+-------------+-------+------------+--------+------------------------------------------+----------------------------------+---------+------------------------------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+--------+------------------------------------------+----------------------------------+---------+------------------------------+------+----------+-------+
| 1 | SIMPLE | A | NULL | ref | PRIMARY,D4b797d14e515242e7251754c57b7701 | D4b797d14e515242e7251754c57b7701 | 4 | const | 5175 | 100.00 | NULL |
| 1 | SIMPLE | B | NULL | eq_ref | PRIMARY | PRIMARY | 4 | value | 1 | 100.00 | NULL |
+----+-------------+-------+------------+--------+------------------------------------------+----------------------------------+---------+------------------------------+------+----------+-------+
「ORDER BY ...」を追加/削除すると、実行計画が変更される可能性があります。どのように違うのかを見るには、どちらの場合でも 'EXPLAIN SELECT ...'を試してみてください。さらに: 'table.parent'、' table.date'、 'table.value'や' anothertable.value'がインデックスに登録されていますか? – Sasha
3つのフィールドのすべてが索引付けされます。 –
もう1つの観察:このクエリを毎回実行すると、実行時間が長くなるわけではありません。いくつかは即座に実行され、いくつかはより多くの時間を取る - 同じクエリ、両親/日付の異なる値 –