关于mysql一次性批量操作,导致连接线程堆栈溢出问题

报错如下:SQLSTATE[HY000]: General error: 1436 Thread stack overrun: 246160 bytes used’mysqld --thread_stack=#’ to specify a bigger stack.

解决方式一之简单粗暴改配置:

https://www.cnblogs.com/jqmtony/p/10534979.html

Thread_stack:每个连接线程被创建时,MySQL给它分配的内存大小。当MySQL创建一个新的连接线程时,需要给它分配一定大小的内存堆栈空间,以便存放客户端的请求的Query及自身的各种状态和处理信息。

查看连接线程相关的系统变量的设置值: show variables like ‘thread%’;

这就是mysql的thread_stack连接线程的优化:

http://www.cppcns.com/shujuku/mysql/184343.html

如果还解决不了,

或者觉得不够优雅,

那么请看解决方式二之简化sql语句:

分批处理,减少sql的长度

1、单条不复杂的sql语句简化:

$data = array_chunk($data,1000); //分割数组
foreach($data as $item){
    //查询、写入或者更新TODO
}

2、多条稍微复杂的sql语句简化:

//定义总操作长度
$totalCount = 5989;
//定义分页
$pageSize = 1000;
$num = ceil($totalCount /$pageSize);

//以批量查询举例,此数组存查询结果集
$dataArr = [];
for ($i = 0;$i<$num;$i++){
    
    //处理页码
    if($i<=0) $i = 1;
    $start = ($i - 1) * $pageSize;
    
    //查询TODO
    $sql = "查询语句 limit {$start},{$pageSize}";
    //得到结果再循环拼接条件sql再查询等等略
    $data = "执行查询sql";
    
    $dataArr = array_merge($dataArr,$data);
    unset($data);
}

你可能感兴趣的:(php进阶,php大杂烩,mysql,数据库,php)