MySQLのSELECT句で * と id で異なるidのレコードが取得出来る場合の対応

以下2つのSQLで取得出来るレコードのidが異なった。

SELECT * FROM table WHERE hoge = fuga LIMIT 1;

SELECT id FROM table WHERE hoge = fuga LIMIT 1;

ほしいデータとして正しいのは上のクエリ、しかし実行したいのはしたのクエリである。
原因はMySQLのLIMITクエリ最適化らしく、LIMITの指定が少ない場合、インデックスが使用されることがあるらしい。

詳しくは以下
8.2.1.19 LIMIT クエリーの最適化

どうすればいいかというと、ORDER BY句でちゃんと並び替えればいい。

SELECT id FROM table WHERE hoge = fuga ORDER BY id LIMIT 1;

idはPKなのでORDER BY指定しなくてもid昇順で取ってくると思ってたけどそうでもないだな…

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中