2011-07-02 4 views
3

愚かな質問かもしれませんが、私はカーテンの後ろに何が起こっているのか不思議です。MySQLでLIMITとOFFSETを使用するのは、完全なレコードセットを返すよりも安価ですか?

データベースレコードのページ番号を設定する場合は、LIMITとOFFSETのどちらかを使用するか、すべてのレコードを取得して、より多くのコードで必要なものを推測することができます。

私はちょうど私がLIMITを使用して、私が求めるだけで何のデータベースのグラブがする、または内部的にすべてのレコードを取得しますが、OFFSET場合、それは

より高価であるかどうかを知りたい、第二の選択肢は絶対に愚かなことを知っています私のクエリ(何十万も)と一致し、レコードの要求されたサブセットを取得するために開始インデックス(OFFSET)と終了インデックス(OFFSET + LIMIT)を内部的に使用しますか?

私が疑問を説明するために適切な言葉を使用したかどうかは分かりませんが、私は誰かが光を放つことを願っています。

ありがとうございます!

答えて

7

はい、2つの理由から、より高額になります。

1)Mysqlは内部的にすべてを取り出すのではなく、必要な行のみを計算するように内部最適化します。この最適化は、クエリでオーダーがあった場合、データセット内のすべての行をマッチングしてソートする必要があるため、最初のXが見つかったときに停止するのではなく、

2)すべてのレコードが返されると、それらはすべてデータベースからアプリケーションサーバーに転送される必要があります。特に中規模から大規模のデータセットの場合、時間がかかることがあります。

+0

私たちはクエリを注文する必要がありますが、多くの時(特に、ページ区切りの環境を想定したリミットとオフセットがある場合)には、すばらしい答えと良い呼び出しが必要です。しかし、再び、素晴らしい答え、たくさんのお付き合いありがとうございます –

+0

あなたがあなたのクエリをどのように構築するかに応じて注文するかどうかは、返さなければならないよりも多くの行を生成する必要があります。例えば、order byとgroup by節の両方に同じ列が現れるなど、注文に使用されたインデックスと結果行数の間に1対1の対応がある場合、データベース*は行をスキップすることができますオフセットによってトリミングされます。少なくとも、オーダーに使用されている同じ索引を中心に照会を計画することができれば、制限で調整された後続の行は生成する必要はありません。 – SingleNegationElimination

+0

TokenMacGuyには良い点があります。処理を最適化するために、特別なケースとして結果と一致するようにインデックスを最適化することが可能です。 –

1

大きな違いがあります。ネットワークの差異が大きくなるだけでなく(数行から数千にも及ぶ)、データベースの検索に必要な行数も大きくなる可能性があります。たとえば、10行を要求すると、すべての行をチェックするのではなく、10行を見つけた後でデータベースを停止することができます。

可能な限り、LIMITとOFFSETを使用してください。

+0

おかげで、私はそれを行うための方法を考えるしようとしていますが、私のシナリオは少し複雑です現時点では:どこ **場合** Wordpressのウェブサイト、私はフォトギャラリーを構築しています投稿を表示する(写真を含む投稿のリストを見る)と画像を表示する(同じページに、それらの投稿から来た写真の完全なリストも表示されます)。 1)写真のカテゴリ 2)ポイントの投稿の子供であるすべての画像の添付記事を取得する( )3)適切なレイアウトで正しいコンテンツを表示し、PHPロジックでページを右にする –

関連する問題