MySQL

2015/10/15 23:00:57
こんばんわ!

Noranekoです。


思うところがあり、MySQLをチューニングしてみました。

システムにもよりますが、今まで数千件のデータを一件ずつグルグル回してinsertしてたのですが、

ちょっと時間もかかるようになってきたので、一括insertに変更しました。


SQLなんかも特に難しい書き方はせず、

『,』

で繋げていくだけです。

INSERT INTO
(id, clm0, clm1, clm2)
VALUES
(0, 'hoge0', 'hoge1', 'hoge2'),
(1, 'hoge10', 'hoge11', 'hoge12'),
(2, 'hoge20', 'hoge21', 'hoge22')

これが基本。

で、最後のカンマを取りたいのでphpを使って、

$sql = substr($sql, 0, -1);
$res = $dbCon->query($sql);

として、流しましょう!!

よしよし、これでぐっすり寝れる。











寝れませんでした!




Duplicateエラーでこけてました。

しかも一気に流すので、ひとつもINSERTできていませんでした^q^


当然やね!



なので、最初のSQLにある魔法の言葉を加えます。

INSERT IGNORE INTO
(id, clm0, clm1, clm2)
VALUES
(0, 'hoge0', 'hoge1', 'hoge2'),
(1, 'hoge10', 'hoge11', 'hoge12'),
(2, 'hoge20', 'hoge21', 'hoge22')


どこが変わったかよくわかりませんね。




IGNORE



これを追加しました。



無事INSERTできて、ぐっすり眠れる日が来ました。
















しかし、ある日見慣れぬエラーが!!!








次回、






『迫りくる脅威、この愛は届くのか?』





をお送り致します。








と、次回に持ち越しても良かったんですが、備忘録にならないので続けます!



それで、その時遭遇したエラーと言うのが、








MySQL server has gone away





義務教育6年間+αの英語教育を習った私は驚愕しました。





has gone away



この言葉の重み!!

直訳すると




『逝ってしまわれた』





ですよ!!

しかも、present perfectです!!


うおおおおおおDB逝ったあああああ!


と思いましたが、MySQLWorkbenchは繋がってSQLも打てる状態でした。


なんなんだこのエラーメッセージは...


ORACLEしかり何故こうもDBのエラーメッセージはうんこなのか?


わかりやすいエラーを表示すると死ぬの?馬鹿なの?


ということでググル先輩に聞いてみたところ、タイムアウトとかいろんな要因がでてきます。


が、私の場合心当たりがあるので、そこを調べてみたところビンゴでした。


その前に下記のSQLを流してみましょう

SHOW VARIABLES LIKE 'max_allowed_packet'
>1048576



となるはずです。

これは一回のSQLで流せるのが1,048,576Byte

つまり1MBですよ!

と言う意味です。

案の定、数千件のINSERT文のバイト長を調べたところちょっと超えていました。

一応カラム長とかから、大雑把に計算してその件数を決めていたのですが、

本当にわずかに超えていました。

おしかったね!

ちなみにバイト長を調べるには、


echo(strlen($sql));



とすればわかります。

なので件数を半分にしました。



これでぐっすり眠れるようになりました!


おしまい。




気に入ったら押してね
  ブログランキング・にほんブログ村へ




~こんなアプリ出してます~

authored by Noraneko | Comment(0) | LAMP
コメント


お名前*

Email Address

URL

コメント*



BLOG内検索
<< 2024/11 >>
Sun Mon Tue Wed Thu Fri Sat
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
<< 過去ログ >>