MySQL批量处理

一、使用PHP exec 启动 php 服务,出现 [php] <defunct>

ps -auxf  //查看进程树
exec('/usr/bin/php SwooleConsole.php -a start')  

程序中,禁止使用此函数
二、 大数据处理-添加
(1) 拼接SQL
1、for 循环坚决不能处理相关I/O操作,比如数据库操作,Redis
2、for 循环处理拼接SQL语句,查看 max_allowed_packet size ,请求报文大小
3、执行SQL语句,username 保证Unique 唯一性,获取插入ID
4、使用SELECT * FROM table WHERE username in (),查询获取对应id-username 关系
(2)关闭自动提交可以提高导入效率
在导入数据前先执行set autocommit=0,关闭自动提交事务,在导入结束后执行set autocommit=1,恢复自动提交,可以提高导入效率。

三、大数据处理-更新
一般情况下,我们在更新批量操作的时候都使用循环更新数据

foreach ($data as $id => $val) {
    $sql = "UPDATE user SET name = $val WHERE id = $id";
    mysql_query($sql);
}

即是循环一条一条的更新记录。一条记录update一次,这样性能很差,也很容易造成阻塞。
mysql并没有提供直接的方法来实现批量更新,但是可以用小技巧来实现。
将条件语句写在了一起。这里的where部分不影响代码的执行,但是会提高sql执行的效率

UPDATE user
SET name = CASE id
    WHEN 1 THEN 'zhangsan'
    WHEN 2 THEN 'lisi'
    WHEN 3 THEN 'wangwu'
END
    WHERE id IN (1,2,3)

这句sql的意思是,更新 user 字段,
如果id=1 则 name 的值为 'zhangsan',
如果id=2 则 name 的值为 'lisi',
如果id=3 则 name 的值为'wangwu'。

$all = (new UsersModel)->get()->toArray();  // 数据查询二维数组
$all_data = [];
foreach ($all as $k=>$v){
    $id = $v['id'];
    if($id > 1){
        $username = trim($v['username']);
        $all_data[$id] = md5($username);
    }
}

$ids = implode(',', array_keys($all_data));
$sql = "UPDATE mpa_users SET passwd = CASE id ";
foreach ($all_data as $id => $ordinal) {
    $sql .= " WHEN {$id} THEN '{$ordinal}' ";
}
$sql .= "END WHERE id IN ($ids)";
echo $sql;

使用这种方式更新,性能有很大提升。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 转载,觉得这篇写 SQLAlchemy Core,写得非常不错。不过后续他没写SQLAlchemy ORM... ...
    非梦nj阅读 5,616评论 1 14
  • 转 # https://www.cnblogs.com/easypass/archive/2010/12/ 08/...
    吕品㗊阅读 10,200评论 0 44
  • https://github.com/ideawu/ssdb-bin
    wyrover阅读 205评论 0 0
  • 科代表来交作业。“王没交”媛说。怎么没交呢?为啥没交?我不停地追问。大概是被问得有些不好意思了,王才慢吞吞地...
    燕语诗心阅读 526评论 0 1
  • 坎子不爱阿兰,这个事情我们都知道。 坎子与阿兰的相遇有着韩剧一样的情节,只是他们没有能够善始善终...
    浅蓝色的枫阅读 381评论 0 0

友情链接更多精彩内容