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昇順で取ってくると思ってたけどそうでもないだな…

広告

Azure Web AppsにMySQLが来た!(Preview)

Announcing MySQL in-app (Preview) for Web Apps

ついに来たか!って感じですね。
Web AppsでMySQLを使うっていうのは以前にしばやん先生が既にやってましたけどついに公式で対応来たか!って感じです。

ポータルから設定できるのは、MySQL In Appの有効化、スロークエリログの有効化、一般ログ有効化の3つ。キャプチャ.JPG

冒頭のリンク先にも書いてありますが、MySQL In Appにはいくつか制限があります。

  • オートスケールをサポートしていない
  • ローカルキャッシュをサポートしていない
  • リモートアクセス出来ない

データを見るときはPHPMyAdminを使えということらしいです。
PHPMyAdminから新しいDBも作れるのでそこそこ使えそうです。

ユーザーは作ってもログインしてるアカウントにGrant権限がないので意味なさそう。