【发布时间】:2014-09-16 19:26:24
【问题描述】:
我正在创建虚拟 MySQL 表数据用于测试目的。表的最小大小为 400 万行。
来自 MySQL documentation -
如果您同时从同一个客户端插入多行, 使用带有多个 VALUES 列表的 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 变量,我不知道速度会增加多少。那么,问题是,如何确定批量插入的最佳步长?
【问题讨论】:
标签: mysql optimization bulkinsert