PostgreSQLのLIMIT・OFFSETとパフォーマンス問題を完全解説|初心者でもわかる安全な使い方
生徒
「PostgreSQLでLIMITやOFFSETを使うと便利なんですが、動きが遅くなることがあると聞きました。本当ですか?」
先生
「本当です。使い方によってはデータベースに大きな負担がかかることがあります」
生徒
「パソコンもSQLも初心者なんですが、ちゃんと理解できますか?」
先生
「大丈夫です。名簿を手でめくるイメージで説明します」
1. SQLとは何か?
SQLは、データベースに保存されている大量の情報を操作するための言葉です。データベースとは、名前や年齢、メールアドレスなどの情報を表の形で整理して保管する箱のような存在です。
SQLを使うことで、その表から必要な行だけを取り出したり、並び替えたり、表示する件数を制限したりできます。LIMITやOFFSETは、その中でも「どこから」「どれくらい表示するか」を決めるための命令です。
2. LIMITとOFFSETの基本的な役割
LIMITは「何件まで表示するか」を指定する命令です。一方OFFSETは「最初の何件を飛ばすか」を指定します。
たとえば、名簿を10人ずつ表示したいとき、1ページ目は最初の10人、2ページ目は最初の10人を飛ばして次の10人を表示します。この「飛ばす人数」がOFFSETです。
3. サンプルテーブルを確認しよう
ここではusersテーブルを使って説明します。まずはSQL実行前の状態を確認しましょう。
id | name | age | email
---+------------+-----+-------------------
1 | 山田太郎 | 25 | taro@example.com
2 | 佐藤花子 | 19 | hanako@example.com
3 | 鈴木一郎 | 30 | ichiro@example.com
4 | 高橋次郎 | 22 | jiro@example.com
5 | 伊藤美咲 | 28 | misaki@example.com
6 | 田中健太 | 35 | kenta@example.com
7 | 小林優子 | 41 | yuko@example.com
8 | 中村翔太 | 23 | shota@example.com
4. LIMIT・OFFSETの基本的な使い方
まずはシンプルなLIMITとOFFSETの例です。次のSQLは、最初の3件を飛ばして、4件目から2件だけ表示します。
SELECT *
FROM users
ORDER BY id
LIMIT 2
OFFSET 3;
実行結果
id | name | age | email
---+------------+-----+-------------------
4 | 高橋次郎 | 22 | jiro@example.com
5 | 伊藤美咲 | 28 | misaki@example.com
5. OFFSETがパフォーマンスに影響する理由
OFFSETは見た目以上にデータベースへ負担をかけます。理由は、OFFSETで指定した件数分のデータも、実際には内部で順番に読み取っているからです。
これは、本の最後のページを見るために、最初のページから一枚ずつめくっている状態に似ています。表示はされませんが、処理としてはすべて通過しています。
OFFSETの値が大きくなるほど、読み飛ばすデータが増え、処理時間が長くなります。
6. 大きなOFFSETを使った例
次のようなSQLは、データが多い環境では注意が必要です。
SELECT *
FROM users
ORDER BY id
LIMIT 10
OFFSET 10000;
この場合、10000件分のデータを読み飛ばしたあとに10件を取得します。データが増えるほど処理は重くなり、画面表示が遅くなる原因になります。
7. ORDER BYがない場合の危険性
LIMITやOFFSETを使うときにORDER BYを指定しないと、表示順が安定しません。データベースは毎回同じ順番で返す保証がないためです。
SELECT *
FROM users
LIMIT 3
OFFSET 2;
このSQLは実行するたびに、違う結果になる可能性があります。必ず並び順を決めることが大切です。
8. パフォーマンスを意識した考え方
初心者のうちは、LIMITとOFFSETは「ページ分割のための便利な道具」として使って問題ありません。ただし、データが増えると負荷が高くなることを覚えておくことが重要です。
「後ろのページほど遅くなる」という特徴がある、という点だけでも理解しておくと、トラブルを避けやすくなります。