Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php-web爬行:讨论;索引唯一URL';s"性能问题_Php_Mysql_Web Crawler_Large Data - Fatal编程技术网

php-web爬行:讨论;索引唯一URL';s"性能问题

php-web爬行:讨论;索引唯一URL';s"性能问题,php,mysql,web-crawler,large-data,Php,Mysql,Web Crawler,Large Data,(请原谅我英语不好) 我正在操作一个特定URL范围内的自定义网络爬虫。 我正在测试它,到目前为止,一切都很正常 最近我注意到一个我想讨论的性能问题——机器人正在抓取索引的页面 在url_池表中,在目标页面中搜索机器人程序保存的目标内容时 如果它们不在表中,则它们找到的页面链接。。。 我在操作几个爬网脚本(同时)时遇到一些冲突问题,但是 我修好了 在抓取了大约150万页之后,我的url_池表包含了近500万行,其中包含 url、一些“标志”、url哈希(32位的simhash)、域等 mysql

(请原谅我英语不好)

我正在操作一个特定URL范围内的自定义网络爬虫。 我正在测试它,到目前为止,一切都很正常

最近我注意到一个我想讨论的性能问题——机器人正在抓取索引的页面 在url_池表中,在目标页面中搜索机器人程序保存的目标内容时 如果它们不在表中,则它们找到的页面链接。。。 我在操作几个爬网脚本(同时)时遇到一些冲突问题,但是 我修好了

在抓取了大约150万页之后,我的url_池表包含了近500万行,其中包含 url、一些“标志”、url哈希(32位的simhash)、域等

mysql db表是innodb,具有较大的缓冲区,并且根据搜索查询的索引良好。 在监控机器人的性能时,我注意到我使用的“检查是否存在”功能 为了防止在我的表中重复URL,速度越来越慢。 我知道,很明显,表越大,在其中搜索所需的时间就越长,但要看到执行时间的增加似乎为时过早

如果我总结一下绩效:

  • url_pool~100K行->0.8s用于整个爬网过程(1页)
  • url\u池~800K行->1.1s
  • url\u池~1.8M行->1.9s
  • url_池~3.5M行->3.2s
  • url_池~5M行->4.8s
另一个重要的事实是,在检查我没有使用文本搜索的表中是否存在url时,我正在创建哈希,然后将其与表中的其他url进行匹配,我遵循了在构建爬虫程序的早期阶段收到的建议,并发现它提高了性能

现在,每一页1.9秒是费用(考虑到同时运行4个机器人),但5秒太慢了

你能给我一些建议吗

编辑:

更多信息:

我使用的是:

SELECT EXISTS(SELECT 1 FROM table1 WHERE ...)
对于索引列上的搜索查询(在文档中建议更快的结果), 表结构是一个非常简单的表

  • 身份证

  • 链接(varchar 400)

  • link_simhash(varchar 32)

  • 域(varchar 200)

  • 旗帜1(布尔)

  • 旗2(铃)

  • 博图访问(国际)

  • 找到日期(日期)

  • 爬网日期(日期)

正如我所说,where指的是链接散列


有什么想法吗???没有人我的问题有什么问题?

您用来查找重复项的查询是什么样子的?您还可以发布表的结构,包括索引和解释吗?感谢您的评论(遗憾的是,您是唯一一个)观看我的编辑…您是否尝试对表应用约束以拒绝已存在哈希的查询?您甚至可以将其索引为唯一。或者只需更改子查询。不要选择1。做一个Select count(*)就不会有问题了。Ryoku,使用unique可能会触发一个不必要的错误。。。我测试了计数(*)与选择1。。。没有区别,因为exists将返回null或1(如果已建立)。还有什么想法吗??