2010年3月25日

[mysql 15220] Re: レコードの存在チェック

坂本と申します。

ご質問の回答は出来ませんが、ロジック的に考えてみました。
id はプライマリーキーですか?
ユニークなキーな場合、そもそもCOUNTの必要はないと思います。
もし、idがユニークではない場合は、COUNTが正しいかと思います。
私もどちらが正しいとか適正だとかは分かりませんが、データの意味的な
ことで言えば、上記の住み分けになるような気がします。


ポイントはWHEREで利用するカラムがindexテーブル上でどうなっているか
だと思います。

以上です。


----- Original Message -----
From: "Hiroshi Hashibata" <hashibata@xxxxx>
To: <ml@xxxxx>
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に変更はしたのですが
> 自分の疑問を晴らすために
> 皆様のお返事をお待ちしています。
>
>
>

投稿者 xml-rpc : 2010年3月25日 11:53
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/94486
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。