回答:
LIMIT句を使用すると、SELECTステートメントによって返される行数を制限できます。LIMITは1つまたは2つの数値引数を取ります。これらは両方とも負でない整数定数でなければなりません(準備済みステートメントを使用する場合を除く)。
2つの引数を使用する場合、最初の引数は返す最初の行のオフセットを指定し、2番目は返す行の最大数を指定します。最初の行のオフセットは0(1ではない)です。
SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15特定のオフセットから結果セットの終わりまでのすべての行を取得するには、2番目のパラメーターに大きな数を使用できます。次のステートメントは、96行目から最後のすべての行を取得します。
SELECT * FROM tbl LIMIT 95,18446744073709551615;引数が1つの場合、値は結果セットの先頭から返す行数を指定します。
SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rowsつまり、LIMIT row_countはLIMIT 0、row_countと同等です。
limit X, Y、どのような基本的に起こることはX + Y行が検索されることで、その後、最初からX行が削除され、残っているものが返されます。繰り返します:limit X, YX + Y行のスキャンになります。
OFFSET;-)
500レコードの場合、効率はおそらく問題ではありませんが、数百万のレコードがある場合は、WHERE句を使用して次のページを選択すると便利です。
SELECT *
FROM yourtable
WHERE id > 234374
ORDER BY id
LIMIT 20
ここの「234374」は、前に表示したページの最後のレコードのIDです。
これにより、idのインデックスを使用して最初のレコードを検索できます。使用LIMIT offset, 20すると、最後に向かってページを移動するにつれて、速度が遅くなることがわかります。前述のように、レコードが200個しかない場合はおそらく問題にはなりませんが、結果セットが大きくなると、違いが生じる可能性があります。
このアプローチのもう1つの利点は、呼び出し間でデータが変更されても、レコードを見逃したり、繰り返しレコードを取得したりしないことです。これは、行の追加または削除は、変更後のすべての行のオフセットを意味するためです。あなたの場合、それはおそらく重要ではありません-私はあなたの広告のプールがあまり頻繁に変化しないと思います、とにかく誰も彼らが同じ広告を2回続けて得ても気付かないでしょう-しかしあなたが「最善の方法」を探しているなら次に、これは、使用するアプローチを選択するときに留意すべきもう1つのことです。
オフセットでLIMITを使用したい場合(ユーザーがページを1つずつページングするのではなく、ページ10000に直接移動する場合に必要です)、遅い行のルックアップに関するこの記事を読んで、大きなLIMITのパフォーマンスを向上させることができます。オフセット。
limit 1000000, 10、それが機能することを期待しても、どこにも行けません。
area=width*height重要なのは投稿ですが、重要なのはレコードの数だけではなく、各レコードのサイズも結果をメモリに保存する際の要素です
クエリのOFFSETを定義します。例えば
ページ1-(レコード01〜10):オフセット= 0、制限= 10;
2ページ-(レコード11〜20)オフセット= 10、制限= 10;
次のクエリを使用します。
SELECT column FROM table LIMIT {someLimit} OFFSET {someOffset};
ページ2の例:
SELECT column FROM table
LIMIT 10 OFFSET 10;
それについての文献があります:
MySQLを使用した最適化されたページ分割。行の合計数のカウントとページ分割の違いを生みます。
Percona Performance Conference 2009のYahoo Inc.によるMySQLを使用した効率的なページネーション。PerconaMySQLチームは、YouTubeビデオとしても提供しています。MySQLを使用した効率的なページネーション(ビデオ)、
大きなOFFSETsを使用すると主な問題が発生します。条項での範囲の選択から、ある種のキャッシュや事前計算ページOFFSETまで、さまざまな手法での使用を避けます。idWHERE
Use the INDEX、Lukeに推奨される解決策があります。
「結果のページング」。
このチュートリアルは、ページ分割を行うための優れた方法を示しています。 MySQLを使用した効率的なページネーション
つまり、OFFSETや大きなLIMITの使用は避けてください
あなたもできる
SELECT SQL_CALC_FOUND_ROWS * FROM tbl limit 0, 20
selectステートメントの行数(制限なし)は同じselectステートメントでキャプチャされるため、テーブルサイズを再度クエリする必要はありません。SELECT FOUND_ROWS();を使用して行数を取得します。
*必要であるよりも多くの列の結果をフェッチし、SQL_CALC_FOUND_ROWSそれらの列の結果は、から読み出される全てそれらが結果に含まれていなくても、テーブル内の行。これらの列をすべて読み取らない別のクエリで行数を計算する方がはるかに効率的です。次に、20行を読み取った後、メインクエリを停止できます。
クエリ1: SELECT * FROM yourtable WHERE id > 0 ORDER BY id LIMIT 500
クエリ2: SELECT * FROM tbl LIMIT 0,500;
クエリ1は、小規模または中規模のレコードでより高速に実行されます。レコード数が5,000以上の場合、結果は類似しています。
500レコードの結果:
Query1は9.9999904632568ミリ秒かかります
Query2は19.999980926514ミリ秒かかります
8,000レコードの結果:
Query1は129.99987602234ミリ秒かかります
Query2は160.00008583069ミリ秒かかります
id。
id > 0役立ちますか?
offset(限界まで最初の引数がオフセットされて)、あなたはまだ、その後の間にあるセクションの復帰、そしてオフセットの量を破棄、限界までのすべてのデータを選択しているoffsetとしますlimit。where一方、with 句では、クエリの一種の開始点を設定し、ONLYその特定の部分をクエリします。
ページングは、単一のテーブルからデータをフェッチする場合は単純ですが、複数のテーブルを結合するデータを取得する場合は複雑です。MySqlとSpringの良い例を次に示します。https:
//www.easycodeforall.com/zpagination1.jsp