2

行が選択された後に制限とオフセットが実行されるかどうかを知りたい:

SELECT * FROM users WHERE id > 4 LIMIT 0,90 ORDER BY datetime DESC;

このクエリは最初にすべてのユーザーの行を選択してから を適用しますか? それともLIMIT、このクエリは最初に適用してLIMITからユーザーの行を選択しますか?

4

4 に答える 4

2

したがって、あなたの質問はここではあまり意味がありません。

実際に質問する必要があるのは、「MySQL はクエリの WHERE 句に一致するすべての行を検索する必要があるのか​​、それとも LIMIT を適用して最大で N 行を読み取るだけでよいのか?」ということです。

ここには 2 つのケースが考えられます。考慮すべき追加事項が 1 つあります。それは、元のクエリの問題です。

  1. LIMIT を使用している場合は、ORDER BY を使用する必要があります。MySQL には「自然な」順序がありません。つまり、そのクエリから実際に返される行は決定論的ではありません。これは悪いことです。

ORDER BY を使用しているため、2 つの可能性があります。

  1. MySQL は、インデックスを使用して ORDER BY 句を満たすことができます。この場合、LIMIT が満たされるまでテーブルをインデックス順にスキャンして一致を探し、そこで読み取りを停止します。これは効率的です。

  2. MySQLはインデックスを使用できません。次に、LIMIT を適用する前に、すべての可能な一致を見つけて、結果セット全体をソートする必要があります。多くの行がある場合、これは一般的にかなり遅くなります。

考慮すべき追加事項は、制限付きのオフセットを使用する場合、mysql は結果を返す前に開始位置までのすべての行を読み取る必要があることです。オフセット値が非常に大きい場合、これは非常に遅くなります。

MySQL の効率的なページネーションに関するこのスライド デッキでは、多くのことが説明されています

于 2012-11-03T09:42:25.697 に答える