人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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文が何バイト越えたら、レプリケーション出来ないとかあるのでしょうか?

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

●質問者: hopefully
●カテゴリ:就職・転職 ウェブ制作
✍キーワード:b2 MySQL SET SQL はと
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● y-kawaz
●27ポイント

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);
◎質問者からの返答

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

サブクエリかーー。

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

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

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


2 ● sphire
●26ポイント

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


3 ● HALSPECIAL
●27ポイント

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



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


のところを、


COLUMB IN (SELECT BVALUE FORM ・・・ )


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

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

◎質問者からの返答

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

INの値をSELECTで取得したら

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


4 ● chuken_kenkou
●10ポイント

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

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

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

INの値をSELECTで取得したら

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

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

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

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ