可以采用批量插入来提供系统吞吐量
1、首先计算单条sql记录插入的sql大小
varchar(10)代表可以存储10个字符,不管是英文还是中文,最多都是10个,这部分假设存储的是中文,在utf-8mb4下,10个中文占用10*4 = 40个字节那么一行数据最多占用:4+4+4+40 = 52字节
my.ini里有max_allowed_packet这个参数控制通信的packet大小。mysql默认的sql语句的最大限制是1M(mysql5.7的客户端默认是16M,服务端默认是4M),可以根据设置查看。官方解释是适当增大max_allowed_packet参数可以使client端到server端传递大数据时,系统能够分配更多的扩展内存来处理。
官方手册:https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html
查看服务器上的参数:
mysql> show variables like '%max_allowed_packet%';+--------------------------+------------+
| Variable_name | Value |
+--------------------------+------------+
| max_allowed_packet | 33554432 |
| slave_max_allowed_packet | 1073741824 |
+--------------------------+------------+
2 rows in set (0.00 sec)
33554432字节 = 32M ,也就是规定大小不能超过32M。2、计算一次能插入的最大行记录
1M计算的话,(1024*1024)/52 ≈ 20165,为了防止溢出,最大可一次性插入20000条(根据自己的配置和sql语句大小计算)。那么32M的话就是:20000 *32 = 640000也就是64W条。个人感觉,最佳大小是max_allowed_packet的一半,也就是极限能插入64W,选用32W也许性能会更好一些,同时也不会对mysql的其他操作产生太大的影响。
网友回复