VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
LIMIT はクエリが返す行数に上限を設けます。大きなテーブルの先頭を見るときに
使うものであり、結果をページ送りする仕組みの土台でもあります。
始める前に mysql -u root -p sakila でクライアントを開いてください。
LIMIT の仕組み
ROW_COUNT を欲しい行数に、SKIP_COUNT を先に読み飛ばす行数に置き換えます。
LIMIT は ORDER BY の後、最後に置きます。OFFSET の部分は省略可能です。
例
- 最初の数行
- 先にいくつか読み飛ばす
- 数値 2 つの形式
MySQL はオフセットと件数を、オフセットを先にしたカンマ区切りの組としても
受け付けます。意味はまったく同じです。
LIMIT ROW_COUNT OFFSET SKIP_COUNT と書きます。
ORDER BY のない LIMIT は任意の行を求める
ORDER BY を外してもクエリは実行されます。
1 warning は追いかけるべきものではありません。EXPLAIN と
EXPLAIN FORMAT=JSON は Note 1003 を付けます。これはオプティマイザが
書き換えた後のクエリを保持しており、SHOW WARNINGS がそれを表示します。
key 列には idx_title とあります。これは title のインデックスで、既に
その列をソートされた順に保持しているので、インデックスを読むのが最も安く
答える方法です。行がソートされて届いたのは、その選択の副作用です。その
インデックスを削除する、選択リストに別の列を加える、サーバーにもっと多くの
データを与える、のいずれかをすれば、クエリを何も変えなくてもその選択は変わり
えます。
LIMIT は、ORDER BY がどの行かを指定しない限り「任意の行」を意味します。
まとめ
- 返ってくる行数に上限を設けるには
LIMITを使います。 - 行を取る前に読み飛ばすには
OFFSETを加えます。 - カンマ形式は数値の順序が逆になるので、
LIMIT ROW_COUNT OFFSET SKIP_COUNTのほうを選びます。 LIMITには毎回ORDER BYを組み合わせてください。さもなければ任意の行を求めたことになります。
関連項目
- ORDER BY — LIMIT がどの行を取るかを決める
- MySQL のページネーション — OFFSET が遅くなる理由と、代わりに使うもの
- MySQL の EXPLAIN の読み方 — そのプラン行の残りの意味