@kyanny's blog

My thoughts, my life. Views/opinions are my own.

どうでもいい mysql のはなし

INSERT INTO ... SELECT ... で700万行のレコードを旧テーブルから新テーブルへ挿入するとき、だいたいどのへんまで進んでてあとどれくらいで終わりそうなのか、を適当にチェックする方法。

SHOW TABLE STATUS で Auto_increment の値を見張るとよい。 mysqldump したのをロードさせてる場合とちがって SHOW PROCESSLIST で実際に挿入されてる行がわからないので、本当にちゃんと進んでんのかこれ?と不安になる、ので不安解消の処方箋に。

あと、 http://d.hatena.ne.jp/t_ishida/20081005#1223194443

とは言えMySQLっていう代物は、恐らく、

ガーっと大量データ突っ込めば良いよ。
大量のデータからインデックスが効くフィールド一個で、ちょっとだけに絞ってデータ取得すれば良いよ
複雑なSQLは書いちゃ駄目よ
と言うアホだけどバカ力なDBだと認識しているので、こういう風に使ってもらいたがってると思う。

    • 一発目で絞れるだけ絞ってね

create temporaly table tmp1 select * from tbl where fld_with_index = 1;
/**
絞りきれてないならインデックス貼っちゃえば良いよ
alter table tmp1 add index ( fld_with_index2 );
**/

    • さらに絞ってね。ここではインデックス使わなくて良いようにする。

create temporaly table tmp2 select * from tmp1 where fld_with_index2 = 2;

    • 結果セット取れば良いよ。 order by

select * from tmp2 order by fld_with_index3

が面白かった。あと、ちょうど CREATE TEMPORARY TABLE をわりかしアグレッシブに使おうとしていたところだったので、これを読んで安心した。ちなみに普通はサブクエリを使って解決すべき問題だが諸般のじj