次のようなクエリがあります。
SELECT article FROM table1 ORDER BY publish_date LIMIT 20
ORDER BY はどのように機能しますか? すべてのレコードを並べ替えてから最初の 20 レコードを取得するか、それとも 20 レコードを取得してpublish_date
フィールドごとに並べ替えるか?
それが最後のものである場合、最新の 20 個の記事を実際に取得できる保証はありません。
次のようなクエリがあります。
SELECT article FROM table1 ORDER BY publish_date LIMIT 20
ORDER BY はどのように機能しますか? すべてのレコードを並べ替えてから最初の 20 レコードを取得するか、それとも 20 レコードを取得してpublish_date
フィールドごとに並べ替えるか?
それが最後のものである場合、最新の 20 個の記事を実際に取得できる保証はありません。
最初に注文し、次に最初の 20 を取得します。データベースは、WHERE
節の前にあるものもすべて処理しますORDER BY
。
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 と同じです。
[asc] または [desc] を順序の最後に追加して、最も古いレコードまたは最新のレコードを取得できます
たとえば、これにより、最新のレコードが最初に表示されます
ORDER BY stamp DESC
LIMIT
句を後に追加ORDER BY
適切なインデックス (この場合はpublish_date
フィールド) がある場合、MySQL はインデックス全体をスキャンして要求された 20 レコードを取得する必要はありません。20 レコードはインデックスの先頭で見つかります。ただし、適切なインデックスがない場合は、テーブルのフル スキャンが必要になります。
これに関する2009 年のMySQL Performance Blog 記事があります。
このコードを使用できます
SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10
。ここで、0 はレコードの開始制限であり、10 はレコード数です
LIMIT は通常、最後の操作として適用されるため、結果は最初に並べ替えられ、次に 20 個に制限されます。実際、並べ替えは、最初の 20 個の並べ替え結果が見つかるとすぐに停止します。