关于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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值