1.首先需要确认mysql服务器上的限制
sql大小的限制
>show variables like '%max_allowed_packet%%'
+--------------------------+------------+
| Variable_name | Value |
+--------------------------+------------+
max_allowed_packet 1073741824
slave_max_allowed_packet 1073741824
换算1073741824字节=1073MB
也就是说sql大小的限制是1073MB
2.获取批量插入时候单条数据的大小
根据表结构来定
CREATE TABLE `delta24_tempdata_merge` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`merge_type` varchar(30) NOT NULL DEFAULT '',
`val` varchar(200) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `merge_type` (`merge_type`)
) ENGINE=InnoDB AUTO_INCREMENT=685347 DEFAULT CHARSET=utf8mb4;
varchar(200):代表200个字符,纯英文的话=200个字节,全中文的话=200+4=800字节
varchar(30):代表30个字符=30个字节
int(11):代表11字节
估算一行数据=200+30+11=240字节
3.估算极限情况
服务器端sql大小限制是1073MB
我们刚才计算出一行数据是240字节,1MB的数据量对应的话是(10241024)/240=4369条,防止溢出的话保守4000条数据
那么理论最大值=10004000=4百万条记录一次
这样一次发1G的sql文件过去,大概4百万条记录,mysql服务端的压力是非常大的
4.优化保守情况
为了防止内存溢出及不影响别的sql执行,建议取最大sql大小的一半作为最优批量计算条件
1073MB/2=500MB左右
1MB最多发1000条数据,那么500MB=500*4000=2百万条记录一次