mysql:15220
From: <sydney@xxxxxxxxxx>
Date: Thu, 25 Mar 2010 13:53:58 +1100
Subject: [mysql 15220] Re: レコードの存在チェック
坂本と申します。 ご質問の回答は出来ませんが、ロジック的に考えてみました。 id はプライマリーキーですか? ユニークなキーな場合、そもそもCOUNTの必要はないと思います。 もし、idがユニークではない場合は、COUNTが正しいかと思います。 私もどちらが正しいとか適正だとかは分かりませんが、データの意味的な ことで言えば、上記の住み分けになるような気がします。 ポイントはWHEREで利用するカラムがindexテーブル上でどうなっているか だと思います。 以上です。 ----- Original Message ----- From: "Hiroshi Hashibata" <hashibata@xxxxxxxxxx> To: <ml@xxxxxxxxxx> Sent: Thursday, March 25, 2010 1:05 PM Subject: [mysql 15219] レコードの存在チェック > 橋端と申します。 > > InnoDBのテーブルにレコードが存在するかを > 確認する方法について質問させていただきます。 > > これまでは > #1 > SELECT COUNT(*) FROM tableA WHERE id = xxxx;(xxxxは指定したID) > としてプログラムに返った値に件数があるか0かで判断してきました。 > > しかし先日の案件で上のコードは > 上位のプログラマによって下記のコードに直されました。 > > #2 > SELECT id FROM tableA WHERE id = xxxx; > 返されたResult[0]のidに値が入っているか空かで判断。 > > 変更理由を聞いたところ > ・tableAは頻繁に更新されるため#1のクエリーがたくさんプロセステーブルに残っている時がある > ・MySQLはよく分からないが、前のオラクル案件では*はNGだった > ・tableAの更新頻度は変えられないため、苦肉の策 > ということでした。 > > そこで疑問に思ったのですが2点あります。 > (1)#1はWHEREで該当するIDのレコードを選び出し、COUNTでその件数を数えるというクエリですよね。 > *からカラム名に変えることでMySQLの動作はどう変わりますか? > (2)InnoDBは行レベルロックなのでtableAの更新中に#1のレコードが止まるということは > 同じレコードの更新/読み込みが発生しているからでは?だとしたら#2も同じではないか。 > > 既に#2に変更はしたのですが > 自分の疑問を晴らすために > 皆様のお返事をお待ちしています。 > > >
15219 2010-03-25 11:05 [Hiroshi Hashibata <h] レコードの存在チェック -> 15220 2010-03-25 11:53 ┗[<sydney@xxxxxxxxxx> ] 15221 2010-03-25 12:15 ┗[Hiroshi Hashibata <h] 15222 2010-03-25 12:25 ┣[Mikiya Okuno <Mikiya] 15223 2010-03-25 12:26 ┣[Akio Imai <suzuro204] Re: [mysql 15221] Re: レコードの存在チェック 15224 2010-03-25 13:09 ┃┣[Mikiya Okuno <Mikiya] Re: レコードの存在チェック 15226 2010-03-25 13:20 ┃┗[宮田 昌紀 <moyata@xx] Re: レコードの存在チェック 15227 2010-03-25 14:39 ┃ ┗[Akio Imai <suzuro204] Re: [mysql 15226] Re: レコードの存在チェック 15228 2010-03-25 17:02 ┃ ┗["Tadayuki Abraham HA] MySQLの公共システムへの利用率について 15225 2010-03-25 13:12 ┗["EBIHARA, Yuichiro" ]