我有一个永远运行的Python爬虫。
这是手头的问题:
# Time: 151201 19:36:18
# User@Host: root[root] @ localhost []
# Query_time: 25.516377 Lock_time: 0.000059 Rows_sent: 1 Rows_examined: 55589711
SET timestamp=1449016578;
SELECT SQL_CALC_FOUND_ROWS * FROM `links` WHERE `URL` LIKE '%http://www.smallbizpages.ca/%' LIMIT 1;
# Time: 151201 19:37:01
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 32.796236 Lock_time: 0.000074 Rows_sent: 50 Rows_examined: 13245375
SET timestamp=1449016621;
SELECT * FROM links WHERE URL LIKE '%smallbizpages.ca%' ORDER BY dateChecked ASC LIMIT 50;
25-32秒的查询时间确实会减慢其他脚本和线程的速度。
我的架构:
我的索引:
我已将所有内容设置为索引,但它仍然运行得如此之慢。索引太多了吗?还不够吗?
该程序基本上执行选择,然后执行插入并重复。
答案 0 :(得分:2)
插入行时,必须将值添加到索引中。
删除行时,必须从索引中删除该值。
更新索引列中的值时,必须在索引中更新该值。
除去LIKE子句中的前导'%'。
你最好的选择是获得你的执行计划,看看为什么它很慢(你可以用你的执行计划发布另一个问题。可能在dba堆栈交换上获得更好的结果)。
答案 1 :(得分:2)
column LIKE '%whatever%'
无法使用索引。怎么可能呢?所以它恢复到完整扫描。
另一方面,不错的SQL数据库能够使用column LIKE 'whatever%'
的索引,这可能与您的情况更相关。
除此之外,您可能需要在scheme / host / path中拆分URL并对其进行规范化,以便您可以轻松获取给定主机的所有请求。此外,URL的255个字符限制会让您遇到麻烦。