【メモ】MySQLの「LIMIT 0, 1」と「LIMIT 1」

mysql_logo.png

結果の先頭から1件を取得する場合、手癖で「LIMIT 0, 1」と書いてしまいがちなんですが。

SELECT * FROM items LIMIT 0, 1;

これに対してレビューで「LIMIT 1 で良くないですか?」というコメントをいただく。

SELECT * FROM items LIMIT 1;

それで何か変わるって話は聞いたことはないけど、コメント貰ったので一応仕ドキュメントを確認。



MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.2.9 SELECT 構文

LIMIT 句を使用すると、SELECT ステートメントによって返される行数を制約できます。LIMIT は 1 つまたは 2 つの数値引数を受け取ります。これは、どちらも負ではない整定数である必要があります。ただし、次の例外があります。

  • 準備済みステートメント内では、? プレースホルダマーカーを使用して LIMIT パラメータを指定できます。
  • ストアドプログラム内では、整数値のルーチンパラメータまたはローカル変数を使用して LIMIT パラメータを指定できます。
引数が 2 つの場合、最初の引数は返す先頭行のオフセットを指定し、2 番目の引数は返す行の最大数を指定します。最初の行のオフセットは (1 ではなく) 0 です。

SELECT * FROM tbl LIMIT 5,10;  # Retrieve rows 6-15
特定のオフセットから結果セットの最後までのすべての行を取得するために、2 番目のパラメータにある程度大きい数字を使用できます。次のステートメントは、96 行目から最後の行までのすべての行を取得します。

SELECT * FROM tbl LIMIT 95,18446744073709551615;
引数が 1 つの場合、この値は、結果セットの先頭から返す行数を指定します。

SELECT * FROM tbl LIMIT 5;     # Retrieve first 5 rows
つまり、LIMIT row_count は LIMIT 0, row_count と同等です。



というわけで、まあこれは定義的にもパフォーマンス的にも同じ意味ですね。
オフセットを省略するかしないかの違いです。

僕にとっては単純に昔からそうやって書いて来たというだけであってそれ以上のこだわりはなく、多分レビュワーしてくれた彼も同じだと思うので、まあここは彼に合わせておいた方が良いかなということで「LIMIT 1」に統一することにしました。そういうコーディングルール決めてるところとかあるんですかね?見映え以上ではないし可読性も変わらないのでどっちでも良いんじゃねって思いますが。