如何加快MySQL中插入/更新1-2mb文本字段的速度?

时间:2011-09-02 16:56:23

标签: mysql insert performance

我写的是收集网页的机器人,但有些页面大约1-2mb(通常很大的Ex.pantip.com)所以我现在如何加速

如果满足超过1mb的页面,则每行更新需要4-9秒。

提前感谢

3 个答案:

答案 0 :(得分:1)

你需要绝对增加max_allowed_pa​​cket并重新启动mysql。像

这样的东西
[mysqld]
max_allowed_packet=256M

MySQL的一个无声杀手是MySQL数据包,由max_allowed_packet管理。

了解MySQL数据包可能会澄清这一点。

根据page 99 of "Understanding MySQL Internals" (ISBN 0-596-00957-7),以下是第1-3段解释它:

  

MySQL网络通信代码是   写在假设下   查询总是相当短,   因此可以发送到和   由服务器在一个块中处理,   在MySQL中称为数据包   术语。服务器分配   用于存储的临时缓冲区的内存   数据包,它请求足够   完全适合它。这种架构   需要预防措施以避免拥有   服务器耗尽内存---一个上限   关于数据包的大小,这个   选项完成。

     

与之相关的代码   此选项位于   的 SQL / net_serv.cc 即可。看看 my_net_read(),然后按照 my_real_read()的电话付费   特别注意   的 net_realloc()

     

此变量也限制了长度   许多字符串功能的结果。   参见 sql / field.cc 和    sql / intem_strfunc.cc 了解详情。

鉴于此解释,批量INSERT将很快加载/卸载MySQL数据包。当max_allowed_pa​​cket对于给定的数据负载而言太小时,尤其如此。

<强>结论

在MySQL的大多数安装中,我通常将其设置为256M或512M。您应该使用涉及BLOB和TEXT字段的数据加载来试验更大的值。

答案 1 :(得分:0)

使用LOAD DATA而不是insert for bulk insert

您是否为每条记录使用个别陈述?您可能希望查看LOAD DATA infile以进行批量更新。

快速插入的提示:

使用LOAD DATA INFILE语法让MySQL解析并插入它,即使你必须修改它并在操作后提供它。 使用此插入语法:

插入表(col1,col2)值(val1,val2),(val3,val4),...

在插入之前删除所有键/索引。

在你所拥有的最快的机器中执行它(主要是IO,但RAM和CPU也很重要)。数据库服务器,还有插入客户端,记住你将支付两倍的IO价格(一次读取,第二次插入)

MySQL Inserting large data sets from file with Java

答案 2 :(得分:0)

如果您向我们展示查询,表信息(SHOW CREATE TABLE),有关服务器的信息,MySQL设置以及可能的示例数据,我们可以帮助您。

但总的来说:

  • 尝试使用交易:BEGIN TRANSACTION,大量插入,COMMIT将比大量插入更快;
  • 您可以在缓存,临时表或文件中执行INSERT,然后才能将它们加载到永久表中。
  • 您应该注意正确设置服务器,使用正确的缓冲区大小和正确的表存储引擎。
  • 您可以在多个磁盘上对表进行分区,以加快插入速度。
  • 您可以在插入期间禁用触发器和索引。
  • 如果您一次插入多行,请执行一个包含多个VALUES的INSERT。