<?php //示例代码 $max_allowed_packet = ini_get('max_allowed_packet'); echo "max_allowed_packet = $max_allowed_packet\n"; //输出max_allowed_packet的值 //假设数据表test有3个字段: id, name, age $data = array(); for ($i=1; $i
以上示例代码中,大家假设数据表test有3个字段: id, name, age。大家要批量插入10000条数据,每条数据是一个元组,包含id, name, age三个字段的值。为了构造数据,大家使用了一个循环来生成10000条元组,其中name值是name_1, name_2, … , name_10000,age值是18到60之间的随机数。
将10000条元组的值连接成一个字符串,得到values值,然后用它构造批量插入的SQL语句。
INSERT INTO test(id, name, age) VALUES (1, 'name_1', 30),(2, 'name_2', 38),...,(10000, 'name_10000', 22);
如果大家尝试执行这个SQL语句,MySQL可能会报以下错误:
ERROR 2006 (HY000): MySQL server has gone away
这是因为MySQL默认允许的数据包大小有限制,如果批量插入的数据包大小超过了限制,就会发生上述错误。可以查看max_allowed_packet参数的值,它是允许的最大数据包大小(单位:字节)。可以通过修改my.cnf配置文件中的max_allowed_packet参数来增加允许的最大数据包大小。
以MySQL 5.7为例,max_allowed_packet的默认值是4MB(4194304字节)。如果大家构造的SQL语句中,values值的大小超过了4MB,就会触发上述错误。在实际应用中,应根据具体情况进行调整。
因此,MySQL批量insert支持的数据条数与每条数据的大小有关,可以通过max_allowed_packet参数来调整允许的最大数据包大小。需要注意的是,数据包大小不能太大,否则可能会影响插入的性能和稳定性。