PHP5でPDOを使って

MYSQLの5.1.30または、5.4.0を使用しているのですが
以下のようなSQLがあり、COLUMB = B の部分で
Bの値が変動して、10万回実行するようなSQLがあります。
UPDATE TESTA SET DEL=1 WHERE COLUMA = A AND COLUMB = B

これを、TESTAが動的に34回変動してその中で毎回、10万回実行するのは
結構なSQL発行回数になるので、COLUMB IN (B,B1,B2・・・・)みたいな
感じで、SQLの実行回数は、34回にして、Bの値をINで渡したいと
思うのですが、INの値に、10万個を渡すのは可能でしょうか?
それを行った場合に、最初の、UPDATE文を10万回するのと、
INにして、一回のSQLにした場合に、処理の負荷や、処理時間などは改善されますか?
ほかに、こういう方がいいのではとかあれば教えて欲しいです。

それと、このSQL文が結構長いと思うのですが、SQL文の長さに関しても上限って
あるんですかね?
自分の見解としては、TEXTフィールド複数もったテーブル構造が
可能なので、特に、SQL文の長さに対しての上限はないと思うのですが。
SQL文が何バイト越えたら、レプリケーション出来ないとかあるのでしょうか?

わかる方がいたら、教えて欲しいです。

回答の条件
  • 1人10回まで
  • 登録:2009/06/26 23:44:44
  • 終了:2009/07/03 23:45:04

回答(4件)

id:y-kawaz No.1

y-kawaz回答回数1419ベストアンサー獲得回数2252009/06/27 00:15:25

ポイント27pt

B1,B2~の値が入ってる10万行のテーブルをサブクエリでSELECTすればいいです。

UPDATE TESTA SET DEL=1 WHERE COLUMA = ? AND COLUMB IN (SELECT B_VAL FROM B_TABLE);

いっそ34種類のAの値もテーブルに用意してしまって以下のようにすれば1回のSQLで済むと思います。

UPDATE TESTA SET DEL=1 WHERE COLUMA IN (SELECT VAL_A FROM TABLE_A) AND COLUMB IN (SELECT VAL_B FROM TABLE_B);
id:hopefully

なるほどーー。これは試してみますね。

サブクエリかーー。

34種類の、Aの値ではなく、テーブルが、34個あります。

すいません。わかりにくくにて。

Aの値は、10万回投げても同じ値ですね。

2009/06/27 00:34:23
id:sphire No.2

sphire回答回数115ベストアンサー獲得回数122009/06/28 00:58:57

ポイント26pt

INの値に、10万個を渡すのは可能でしょうか?

my.cnf等でmax_allowed_packet設定を大きくしておけば(そして必要なだけメモリが積まれていれば)大丈夫ではないかなーと思います。

なお、上記設定が不足している場合は「Packet too large」エラーが発生します。

http://dev.mysql.com/doc/refman/4.1/ja/packet-too-large.html

INの中に書ける個数については過去に質問がありますね。

http://q.hatena.ne.jp/1187694260

id:HALSPECIAL No.3

HALSPECIAL回答回数407ベストアンサー獲得回数862009/06/27 00:31:50

ポイント27pt

「B,B1,B2・・・・」はテーブル値としてとってこれますか?



COLUMB IN (B,B1,B2・・・・)


のところを、


COLUMB IN (SELECT BVALUE FORM ・・・ )


といった具合にSELECT文にするとか、

EXISTS を使った構文にすることができれば、SQLは長くなりませし効率も良いと思います。

id:hopefully

効率が悪かったですね・・

INの値をSELECTで取得したら

すげえ、遅くなりました・・

2009/07/01 00:11:16
id:chuken_kenkou No.4

chuken_kenkou回答回数722ベストアンサー獲得回数542009/07/01 19:46:40

ポイント10pt

同じような表が34個、それぞれの表の10万行を「削除フラグを立てる」といったようなupdateするのですね?

同じような表が34個もあるというのは、設計上、どうなのかと疑問に感じますが、それはさておき本題です。

inで並べたいというCOLUMNBの値は、どこから持ってくるのでしょうか?

INの値をSELECTで取得したら

すげえ、遅くなりました・・

他の表から、その値を引っ張ってこれるのですよね?

その場合の検索条件などは、どうなっているのでしょうか?

それを得る検索で、インデクスを適切に定義し、効率的に利用されているでしょうか?

MySQLでは、4.1でサブクエリが実装されましたが、その頃は、サブクエリで期待したようにインデクスが利用できず、LEFT JOINなどを利用した方がインデクスを活用できるといったことがありました。

この辺は、EXPLAINで確認されているでしょうか?

もう少しやりたいことを詳しく説明してもらえれば、例えば「ストアドプロシジャを使って、「サーバとのやり取りを激減させられないか?」といったことなどが検討できると思うのですけどね。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません