【问题标题】:MySQL - How can we determine the optimal number of bulk insert statements for inserting a large number of rows in a table?MySQL - 我们如何确定在表中插入大量行的批量插入语句的最佳数量?
【发布时间】: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_pa​​cket 变量,我不知道速度会增加多少。那么,问题是,如何确定批量插入的最佳步长?

【问题讨论】:

    标签: mysql optimization bulkinsert


    【解决方案1】:

    以mysqldump工具的代码为例。它生成插入多行的 INSERT 语句。考虑到行可以是可变长度的,它如何确定最佳行数?

    它一一追加行,而带有数据行的总 INSERT 语句的长度小于net_buffer_length。这是另一个 MySQL 配置变量,它会影响您可以提交给服务器的最大单个语句。

    也就是说,如果INSERT语句的长度+下一行数据的长度>net_buffer_length,则结束当前语句,然后使用下一行数据开始新的语句。

    【讨论】:

    • +1 有趣的点。虽然,我确实发现“连接缓冲区和结果缓冲区都以等于 net_buffer_length 字节的大小开始,但会根据需要动态放大到 max_allowed_pa​​cket 字节。”所以似乎 max_allowed_pa​​cket 应该是我关心的全部? (我想增加缓冲区大小不会花费大量时间)
    • @Wes 是的,你应该增加 max_allowed_pa​​cket dev.mysql.com/doc/refman/5.6/en/…
    猜你喜欢
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 2012-12-29
    • 1970-01-01
    • 2011-07-28
    相关资源
    最近更新 更多