(原谅我英语不好)
我在特定范围的 URL 上运行自定义网络爬虫。我正在对其进行测试,到目前为止一切正常。
最近我注意到一个我想讨论的性能问题 - 机器人正在爬取在 url_pool 表中索引的页面,同时在目标页面中搜索目标内容,如果它们不在表中,机器人会保存它们找到的页面链接已经...我在操作多个爬网脚本(同时)时遇到了一些冲突问题,但我修复了它。
在爬取了大约 150 万页后,我的 url_pool 表包括近 5M 行,其中包含 url、一些“标志”、url 哈希(simhash - 32 位)、域等......
mysql db 表是具有大缓冲区的 innodb,并且根据搜索查询的索引很好。我在监控机器人的性能时注意到,我用来防止表中重复 url 的“检查是否存在”功能越来越慢。我知道很明显,表越大,在其中搜索所需的时间就越长,但现在看到执行时间的增加似乎还为时过早。
如果我总结表现:
- url_pool~100K ROWS -> 整个爬取过程(1页)0.8s。
- url_pool~800K ROWS -> 1.1s
- url_pool~1.8M ROWS -> 1.9s
- url_pool~3.5M ROWS -> 3.2s
- url_pool~5M ROWS -> 4.8s
另一个重要的事实是,在检查表中是否存在 url 时我没有使用文本搜索,我正在创建哈希,然后将其与表中的其他人匹配,我遵循了我在构建爬虫的早期阶段收到的建议,并发现它提高了性能。
现在,每页 1.9 秒是票价(考虑同时运行 4 个机器人),但 5 秒太慢了......
你能给我建议吗?
编辑:
更多信息:
我使用一个:
SELECT EXISTS(SELECT 1 FROM table1 WHERE ...)
对于索引列上的搜索查询(在文档中建议获得更快的结果),表结构是一个非常简单的表
ID
链接(varchar 400)
link_simhash (varchar 32)
域(varchar 200)
标志 1(布尔)
标志 2(铃)
bot_visit (int)
date_found (日期)
date_crawled (日期)
正如我所说,where 指的是链接哈希。
有任何想法吗???没有人???我的问题有什么问题???