web-dev-qa-db-ja.com

「制限1000、25」対「制限25オフセット1000」

最近、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行をスキップするという感覚を持っています。

11
Martijn

運用面で

SELECT id,name,description FROM tablename LIMIT 1000,25
SELECT id,name,description FROM tablename LIMIT 25 OFFSET 1000

ステートメントに違いはまったくありません

@sirideのコメントがまさにポイントです。

LIMIT 1000,25LIMIT 25 OFFSET 1000を意味します

同じドキュメントから

LIMIT row_countLIMIT 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番目のクエリは何も返しません

結論

適切な段階でデータをソートしていることを確認するには、クエリをスカルプトする必要があります

9
RolandoMySQLDBA