7章:部分結果
2.次ページの取得
結論
ページングは2種類ある。
OFFSETは簡単だが、スケールしない。
シーク法は少し難しいが高速で安定。
➡ 実務ではシーク法が本質的に優れている。
ページングの2つの方法
ページングには2つある
OFFSET方式
行番号でスキップする。
シーク法
前ページの最後の値を使って続きを取得する。
OFFSETの問題
必要な位置迄、毎回先頭から全部読む必要があるため、
ページが進むほど遅くなる。
➡ OFFSETはシンプルだが本質的に遅い。
さらに、
データが追加されると、ページの中身がズレる。
シーク法の仕組み
シーク法は、「前ページの最後」から続きを取る。
例(降順):
WHERE sale_date < ? ORDER BY sale_date DESC FETCH FIRST 10
これにより、
- 先頭から読まない
- インデックスが使える
➡ 必要な位置から直接取得できる。
なぜシーク法は早いのか
OFFSET
全部読んで捨てる
シーク法
必要な場所から読む
➡ スキャンの仕方が違う
シーク法の注意点
ORDER BYが曖昧だと壊れる。
同じ値があると
- 重複
- 取りこぼし
が発生する。
解決方法
ORDER BYを一意にする。
例:
ORDER BY sale_date, sale_id
➡ 一意キーを追加する
まとめ
- OFFSETは簡単だが遅くて不安定
- シーク法はインデックスを活かせる
- ORDER BYは必ず一意にする
ポイント:ページングもインデックスで解決する