必要以上に実行速度が遅いクエリがあります。問題を単純な select ステートメントに絞り込みました (一部のフィールドはプライバシーのために名前が変更されています)。
SELECT SQL_NO_CACHE SQL_CALC_FOUND_ROWS id, date_started, date_complete, status
FROM table_a
ORDER BY date DESC
LIMIT 0, 100
を使用するSQL_CALC_FOUND_ROWS
と、クエリは約 0.70 秒で完了しますが、SQL_CALC_FOUND_ROWS
を削除すると、クエリは約 0.0005 秒で完了します (どちらの場合もSQL_NO_CACHE
クエリで使用されます)。
table_a
フィールドにインデックスがありdate
ます。
どうやら SQL_CALC_FOUND_ROWSはインデックスの使用を防ぐことができます:
したがって、この単純なテストから明らかな結論は、クエリの WHERE/ORDER 句に適切なインデックスがある場合、SQL_CALC_FOUND_ROWS を使用して 1 つのクエリを使用するよりも、2 つの個別のクエリを使用する方がはるかに高速であることです。
私はこれを確認しました。SQL_CALC_FOUND_ROWS
が含まれている場合、インデックスは使用されません。
EXPLAIN SELECT SQL_NO_CACHE SQL_CALC_FOUND_ROWS id, date_started, date_complete, status FROM table_a ORDER BY date DESC limit 0, 100;
+----+-------------+-------------+------+---------------+------+---------+------+--------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------+------+---------------+------+---------+------+--------+----------------+
| 1 | SIMPLE | table_a | ALL | NULL | NULL | NULL | NULL | 132208 | Using filesort |
+----+-------------+-------------+------+---------------+------+---------+------+--------+----------------+
ただし、SQL_CALC_FOUND_ROWS
が使用されていない場合は、日付フィールドのインデックスが使用されます。
EXPLAIN SELECT SQL_NO_CACHE id, date_started, date_complete, status FROM table_a ORDER BY date DESC limit 0, 100;
+----+-------------+-------------+-------+---------------+------+---------+------+--------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------+-------+---------------+------+---------+------+--------+-------+
| 1 | SIMPLE | table_a | index | NULL | date | 13 | NULL | 132208 | |
+----+-------------+-------------+-------+---------------+------+---------+------+--------+-------+
クエリから削除せずにクエリを高速化する方法はありSQL_CALC_FOUND_ROWS
ますか?
MySQL バージョン 5.0.51a-3ubuntu5.1-log を使用しています。