最近、MySQLにoffset
機能があることがわかりました。オフセットの結果、またはオフセットと制限バリアントの違いについてのドキュメントを探していましたが、探しているものが見つからないようです。
テーブルに10.000行あり、行1.000から25件の結果が必要だとします。これまでのところ、私は同じ結果を得るために両方を行うことができました:
SELECT id,name,description FROM tablename LIMIT 1000,25
SELECT id,name,description FROM tablename LIMIT 25 OFFSET 1000
私が知りたいのは、この2つの違いです。
WHERE column=1
(列に100を超える異なる値があると言います)ORDER BY column ASC
(ランダムな値があると仮定)これが「愚かな」質問であり、誰かがその主題を啓発する文書を知っている場合は、それらを返信に追加してください。
私は、ソートと場所を無視して、オフセットがデータベースで見つかった最初のX行をスキップするという感覚を持っています。
運用面で
SELECT id,name,description FROM tablename LIMIT 1000,25
SELECT id,name,description FROM tablename LIMIT 25 OFFSET 1000
ステートメントに違いはまったくありません
@sirideのコメントがまさにポイントです。
LIMIT 1000,25
はLIMIT 25 OFFSET 1000
を意味します
同じドキュメントから
LIMIT row_count
はLIMIT 0, row_count
と同等です
- これは実際に同じことをするのですか、それとも私の理解は間違っていますか?
- 大きなテーブルでは遅い/速い
両方のクエリが同じであるため、違いはありません
- WHERE column = 1を実行するとオフセット変更の結果が変わりますか(たとえば、列に100を超える異なる値がある)
- ORDER BY列のASCを実行すると、オフセット変更の結果は変わりますか?
LIMIT
を使用しても、結果セットは変更されません。結果セット内を移動するだけです。
このクエリ
SELECT id,name,description FROM tablename ORDER BY id LIMIT 1000,25
とは違うだろう
SELECT * FROM (SELECT id,name,description FROM tablename LIMIT 1000,25) A ORDER BY id;
lIMITが別の段階で適用されているためです。
Tablenameの行数が1000未満の場合、最初のクエリは何も返しません
サブクエリの行数が1000未満の場合、2番目のクエリは何も返しません
適切な段階でデータをソートしていることを確認するには、クエリをスカルプトする必要があります