【りみっと おふせっと】

LIMIT / OFFSET とは?

💡 全部見せなくていいよ!10件ずつページめくりしよう
📌 このページのポイント
LIMIT / OFFSET によるページネーション 全データ(15件) ← OFFSET 5 (5件スキップ) ← LIMIT 5 (5件取得) ページネーション例 1ページ目: LIMIT 5 OFFSET 0 2ページ目: LIMIT 5 OFFSET 5 3ページ目: LIMIT 5 OFFSET 10 注意: OFFSETが大きいと パフォーマンスが低下!
LIMIT / OFFSETのイメージ
ひよこ ひよこ

LIMITとOFFSETって何をするものなの?

ペンギン先生 ペンギン先生

LIMITは「最大何件取得するか」、OFFSETは「何件目から取得するか」を指定するSQLの句だよ。たとえば SELECT * FROM products LIMIT 10 OFFSET 20 なら、21件目から10件を取得するんだ

ひよこ ひよこ

ページ送りに使うってことだよね?

ペンギン先生 ペンギン先生

そう!1ページ10件表示のWebサイトなら、1ページ目はLIMIT 10 OFFSET 0、2ページ目はLIMIT 10 OFFSET 10、3ページ目はLIMIT 10 OFFSET 20という具合だよ

ひよこ ひよこ

すごく便利だね!何か問題はあるのかな?

ペンギン先生 ペンギン先生

OFFSETが大きくなるとパフォーマンスが悪化するんだ。OFFSET 100000だと、データベースは10万行を読み飛ばしてから結果を返すから、すごく遅くなることがあるよ

ひよこ ひよこ

えっ、じゃあ大量データのときはどうするの?

ペンギン先生 ペンギン先生

カーソルベースのページネーションを使うんだ。OFFSETの代わりに WHERE id > 前ページの最後のID LIMIT 10 と書く方法だよ。インデックスが効くから、何ページ目でも一定速度で取得できるんだ

ひよこ ひよこ

データベースによって書き方は違うの?

ペンギン先生 ペンギン先生

MySQLPostgreSQLSQLiteはLIMIT/OFFSETが使えるけど、SQL Serverでは OFFSET ... ROWS FETCH NEXT ... ROWS ONLY という別の書き方になるんだ。OracleもROWNUMやFETCH FIRSTを使うよ。SQL標準ではFETCH FIRSTが正式な構文なんだけどね

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「LIMIT / OFFSET」って出てきたら「取得する行数と開始位置を指定してページ送りする仕組み」と思えればだいたいOK!
📖 おまけ:英語の意味
「LIMIT / OFFSET」 = 制限 / オフセット(ずらし)
💬 limit(制限)で件数を制限し、offset(ずらし)で開始位置をずらすという意味だよ
← 用語集にもどる