7.2.9 MySQL が ORDER BY を最適化する方法
場合によっては、MySQL は追加のソートを行わずに、インデックスを直接使用して ORDER BY または GROUP BY 句を満たすことができます。
ORDER BY がインデックスの順序と正確に一致しなくても、未使用のインデックス部分と追加のすべての ORDER BY フィールドが WHERE 句に含まれている限り、インデックスは引き続き使用できます。次のクエリは、インデックスを使用して ORDER BY または GROUP BY 部分を解決します:
SELECT * FROM t1 ORDER BY key_part1,key_part2,... ;
SELECT * FROM t1 WHERE key_part1=constant ORDER BY key_part2;
SELECT * FROM t1 WHERE key_part1=定数 GROUP BY key_part2;
SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 DESC;
SELECT * FROM t1
WHERE key_part1=1 ORDER BY key_part1 DESC, key_part2 DESC;
インインそれ以外の場合、MySQL はインデックスを使用して WHERE 句に一致するレコードを検索しますが、ORDER BY を満たすためにインデックスを使用することはできません。これらの状況は次のとおりです:
異なるインデックス キーで ORDER BY を実行します:
SELECT * FROM t1 ORDER BY key1, key2;
不連続なインデックス キー部分で ORDER BY を実行します:
SELECT * FROM t1 WHERE key2=constant ORDER BY key_part2;
ASC と DESC の両方を使用する:
SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;
レコードの検索と ORDER BY に使用されるインデックス キー。同じ:
SELECT * FROM t1 WHERE key2=constant ORDER BY key1;
多くのテーブルが結合されており、読み取られたレコードの ORDER BY のフィールドのすべてが最初の非定数テーブルからのものであるわけではありません (つまり、EXPLAIN 分析の結果の最初のテーブルの結合タイプは const ではありません)。