示したように、MySQLには、ORDER BY ... LIMIT n
を使用したクエリ用の2つの代替クエリプランがあります。 :
- 修飾するすべての行を読み取り、並べ替えて、 nを選択します 一番上の行。
- 並べ替えられた順序で行を読み取り、 nで停止します 適格な行が見つかりました。
どちらがより良いオプションであるかを決定するために、オプティマイザはWHERE条件のフィルタリング効果を推定する必要があります。これは、特にインデックスが作成されていない列や、値が相関している列の場合、簡単ではありません。あなたの場合、オプティマイザーが期待したものよりも最初の25の適格な行を見つけるために、ソートされた順序でテーブルの多くを読み取る必要があるでしょう。
5.6の新しいリリース(GAより前のリリースで実行しています!)と新しいリリース(5.7、8.0)の両方で、LIMITクエリの処理方法にいくつかの改善がありました。それ以降のリリースにアップグレードして、これがまだ問題であるかどうかを確認することをお勧めします。
一般に、クエリプランナーの決定を理解したい場合は、クエリのオプティマイザートレースを確認する必要があります。