我写的机器人收集网页,但有些网页很大,大约1-2mb (通常很大,例如。pantip.com)那么现在我该如何加速呢?
如果遇到超过1mb页面,则每行更新需要4-9秒。
提前感谢
发布于 2011-09-03 01:00:27
你一定要增加max_allowed_packet并重启mysql。就像这样
[mysqld]
max_allowed_packet=256M
MySQL的静默杀手之一是由max_allowed_packet管理的MySQL数据包。
了解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。
根据这个解释,进行批量插入将相当快地加载/卸载MySQL数据包。当max_allowed_packet对于到达它的给定数据负载来说太小时,情况尤其如此。
结论
在大多数MySQL安装中,我通常将其设置为256M或512M。您应该尝试使用较大的值来加载涉及BLOB和文本字段的数据。
发布于 2011-09-03 00:59:40
使用LOAD DATA而不是insert进行大容量插入
您是否对每条记录使用单独的语句?您可能需要查看加载数据文件以进行批量更新。
快速插入的提示:
使用LOAD DATA INFILE语法让MySQL解析它并插入它,即使您必须在操作之后破坏它并提供它。使用以下insert语法:
insert table (col1,col2)值(val1,val2),(val3,val4),...
在插入之前删除所有键/索引。
在你拥有的最快的机器上做这件事(主要是IO方面的,但RAM和CPU也很重要)。无论是数据库服务器,还是插入客户端,请记住,您将付出两倍的IO代价(一次读取,第二次插入)
发布于 2011-09-03 01:00:24
如果您向我们展示查询、表信息、有关服务器的(SHOW CREATE TABLE
),信息、MySQL设置以及一些示例数据,我们可以更好地帮助您。
但总的来说:
BEGIN TRANSACTION
,大量插入,COMMIT
将比大量插入更快;https://stackoverflow.com/questions/7286810
复制相似问题