首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL --如何确定在表中插入大量行的大容量插入语句的最佳数量?

问MySQL --如何确定在表中插入大量行的大容量插入语句的最佳数量?
EN

Stack Overflow用户
提问于 2014-09-16 19:26:24
回答 1查看 3.1K关注 0票数 2

我正在为测试目的创建虚拟MySQL表数据。表的最小大小是400万行。

从MySQL 文档 -

如果同时从同一客户端插入多行,请使用具有多个值列表的INSERT语句一次插入多个行。这比使用单独的单行INSERT语句要快得多(在某些情况下要快很多倍)。

我有一个Java程序,它生成一个sql脚本来执行批量插入。它被引用如下-

代码语言:javascript
复制
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万行的大容量插入,但正如预期的那样,这导致了一个错误-

代码语言:javascript
复制
$ time mysql -uroot < testdata.sql
ERROR 2006 (HY000) at line 2: MySQL server has gone away

所以我试着不断地增加步长,当我最终得到错误时-

代码语言:javascript
复制
ERROR 1153 (08S01) at line 1150017: Got a packet bigger 
than 'max_allowed_packet' bytes

在此之前,随着步长的增加,我观察到执行的总时间略有减少。一些样本值-

代码语言:javascript
复制
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变量,速度还会增加多少。因此,问题是,如何确定批量插入的最佳步骤大小?

EN

回答 1

Stack Overflow用户

发布于 2014-09-16 20:27:24

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

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

换句话说,如果INSERT语句的长度+下一行数据的长度> net_buffer_length,则完成当前语句,然后使用下一行数据启动新语句。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25876878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档