创建太多数据库索引的权衡是什么?

时间:2015-12-02 00:44:04

标签: database database-design

我有一个永远运行的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秒的查询时间确实会减慢其他脚本和线程的速度。

我的架构:

enter image description here

我的索引:

enter image description here

我已将所有内容设置为索引,但它仍然运行得如此之慢。索引太多了吗?还不够吗?

该程序基本上执行选择,然后执行插入并重复。

2 个答案:

答案 0 :(得分:2)

插入行时,必须将值添加到索引中。

删除行时,必须从索引中删除该值。

更新索引列中的值时,必须在索引中更新该值。

除去LIKE子句中的前导'%'。

你最好的选择是获得你的执行计划,看看为什么它很慢(你可以用你的执行计划发布另一个问题。可能在dba堆栈交换上获得更好的结果)。

答案 1 :(得分:2)

column LIKE '%whatever%'无法使用索引。怎么可能呢?所以它恢复到完整扫描。

另一方面,不错的SQL数据库能够使用column LIKE 'whatever%'的索引,这可能与您的情况更相关。

除此之外,您可能需要在scheme / host / path中拆分URL并对其进行规范化,以便您可以轻松获取给定主机的所有请求。此外,URL的255个字符限制会让您遇到麻烦。