我正在为测试目的创建虚拟MySQL表数据。表的最小大小是400万行。
从MySQL 文档 -
如果同时从同一客户端插入多行,请使用具有多个值列表的INSERT语句一次插入多个行。这比使用单独的单行INSERT语句要快得多(在某些情况下要快很多倍)。
我有一个Java程序,它生成一个sql脚本来执行批量插入。它被引用如下-
java CreateData -rows 4000000 -stepSize 10000 > testdata.sql
where
rows = total number of rows to insert in the database
stepSize = size of each bulk insert statement.
Thus if we have 4 million rows and a stepSize of 10000,
then we have 400 bulk insert statements. 我试着做了一个包含400万行的大容量插入,但正如预期的那样,这导致了一个错误-
$ time mysql -uroot < testdata.sql
ERROR 2006 (HY000) at line 2: MySQL server has gone away所以我试着不断地增加步长,当我最终得到错误时-
ERROR 1153 (08S01) at line 1150017: Got a packet bigger
than 'max_allowed_packet' bytes在此之前,随着步长的增加,我观察到执行的总时间略有减少。一些样本值-
stepSize 2000
real 3m37.564s
user 0m7.608s
sys 0m0.180s
stepSize 24000
real 1m48.399s
user 0m4.788s
sys 0m0.168s
stepSize 32000
real 1m49.490s
user 0m4.544s
sys 0m0.072s
stepSize 160000
real 1m43.927s
user 0m3.800s
sys 0m0.108s
stepSize 220000
real 1m33.025s
user 0m3.772s
sys 0m0.120s
stepSize 230000
ERROR 1153 (08S01) at line 1150017:
Got a packet bigger than 'max_allowed_packet' bytes我不知道如果我增加了max_allowed_packet变量,速度还会增加多少。因此,问题是,如何确定批量插入的最佳步骤大小?
发布于 2014-09-16 20:27:24
例如,mysqldump工具的代码。它生成插入多行的INSERT语句。考虑到行可以变长,它如何确定最佳行数?
它一个接一个地追加行,而包含数据行的总INSERT语句的长度小于net_buffer_length。这是另一个MySQL配置变量,它影响可以提交给服务器的最大的单个语句。
换句话说,如果INSERT语句的长度+下一行数据的长度> net_buffer_length,则完成当前语句,然后使用下一行数据启动新语句。
https://stackoverflow.com/questions/25876878
复制相似问题