cakephpでupdateをするのにどの方法が一番早いか?

2014年7月11日更新 view: 7 view
photoBy: http://www.windarooci.com/assets/service/image_ur…

どの方法が一番早い?

updateする方法が色々ある。
速度を比較してみた。

条件

  • 新規保存でなく、update
  • cakephp からやってみる
  • DBには id body count 3つのフィールド
  • 指定したid に 指定したcount を突っ込む
  • レコードは32万行。うち、1万行をupdate

やってみる

save を while で回す

40000クエリー 277ms

データを配列化し、saveAll

saveAll (default) 40002 queries took 60 ms
'validate'=>'first' を使う

        $i = 0;
        $ar = array();
        while ($i < 10000){

            $ar[] = array(
                'id' => $i+1,
                'count' => 6
            );

            $i++;
        }

        $this->Work->set($ar);
        $this->Work->saveAll($ar, array('validate'=>'first'));

直接SQL

(default) 10000 queries took 42 ms

$i = 0;
        $ar = array();
        while ($i < 10000){


            $key = $i +1;
            $this->Work->query("UPDATE `test_matomater`.`matomater_works` SET `count` = '2' WHERE `matomater_works`.`id` = ".$key.";");


            $i++;
        }

tmpテーブルを使う

http://qiita.com/masuidrive/items/0671ea7efa91a99c0268

スポンサードリンク

(default) 10002 queries took 590 ms

$this->Work->query("CREATE TEMPORARY TABLE tbl1map(tbl1_id INTEGER, count INTEGER);");



        $i = 0;
        while ($i < 10000){
            $key = $i + 1;
            $this->Work->query("INSERT INTO tbl1map(tbl1_id,count) VALUES(".$key.",9);");
            $i++;
        }

        $this->Work->query("UPDATE `test_matomater`.`matomater_works` INNER JOIN tbl1map ON `test_matomater`.`matomater_works`.id=tbl1map.tbl1_id SET `test_matomater`.`matomater_works`.body=tbl1map.count;");

when case で update

重すぎてタイムアウト

$query = 'update `test_matomater`.`matomater_works` set count = case id';
        $i = 1;
        while ($i < 40000){
            $key = $i +1;
            $query .= ' when '.$key.' then 9';
            $i++;
        }

        $query .= ' end';

うーん。。。やっぱり直接クエリを送るのが早そう。。。

スポンサードリンク

関連記事

関連カテゴリ

コロ助

web関連の記事や制作系の記事をどんどんまとめていきます。 宜しくお願いします!

ピックアップ

パソコン・ソフトウェア ランキング

12月4日 ( 水 ) にアクセスが多かった記事はこちら!