当前位置:   article > 正文

mysql批量更新及拆分_mysql 批量拆表

mysql 批量拆表

        前阵子有个脚本执行特别慢,根据一张表中查询的数据来更新另一张表数据。每晚18:00开始执行,之前一般大概执行到21、22点左右,最近有几次竟然直到凌晨才跑完,这就有点接受不了了。捋了一下脚本,是每查出一条就去更新一条,每次更新时都得连库、操作、然后关闭。就想着能不能一次更新多条呢,也就是写个批量更新语句。
        假设表结构如下:

  1. CREATE TABLE `test_book` (
  2. `id` int unsigned NOT NULL AUTO_INCREMENT,
  3. `book_name` varchar(32) NOT NULL default '' COMMENT '书名',
  4. `uid` int unsigned NOT NULL DEFAULT 0 COMMENT '作者id',
  5. `u_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  6. `c_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  7. PRIMARY KEY (`id`),
  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8

        如果想根据id批量更新book_name字段,可以如下书写:

  1. UPDATE test_book SET
  2. book_name = CASE id
  3. WHEN 1 THEN '三国演义'
  4. WHEN 2 THEN '红楼梦'
  5. WHEN 3 THEN '水浒传'
  6. END
  7. WHERE id IN (1,2,3)

        这样一条语句即可更新三条记录,对id=1的书名更新为三国演义,id=2的书名更新为红楼梦,以此类推。如果是同时更新多个字段,譬如书名和作者id:

  1. UPDATE test_book SET
  2. book_name = CASE id
  3. WHEN 1 THEN '三国演义'
  4. WHEN 2 THEN '红楼梦'
  5. WHEN 3 THEN '水浒传'
  6. END,
  7. uid = CASE id
  8. WHEN 1 THEN 4
  9. WHEN 2 THEN 5
  10. WHEN 3 THEN 6
  11. END
  12. WHERE id IN (1,2,3)

脚本改成批量更新后,运行时间瞬间成为原来的10%,十几分钟顶多半小时就执行完了。

然而随着批量更新的数据量越来越大,又报了另一个问题导致脚本中断了。

Communication link failure: 1153 Got a packet bigger than 'max_allowed_packet' bytes

查看mysql该参数配置:

  1. mysql> select @@max_allowed_packet;
  2. +----------------------+
  3. | @@max_allowed_packet |
  4. +----------------------+
  5. | 16777216 |
  6. +----------------------+
  7. 1 row in set (0.01 sec)

也就是16M。解决方法有两种,要么联系dba扩大该参数值;要么拆分数据。我这里是两种方法都采用了,一方面联系dba将该参数值调整为32M,一方面在代码层面做了修改,一次只更新20000条。

  1. $total = count($res);
  2. echo '共'. $total. "条数据\n";
  3. $k = 0;
  4. while ($k < $total) {
  5. $temp = array_slice($res, $k, 20000);
  6. $success = $model->helper($temp);
  7. echo '成功修改'. $success. "\n";
  8. $k += 20000;
  9. }

至此,批量更新彻底解决。

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/407110
推荐阅读
相关标签
  

闽ICP备14008679号