MySQL批量处理

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

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;

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

你可能感兴趣的:(MySQL批量处理)