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

Database 创建太多数据库索引的权衡是什么?,database,database-design,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` WHE

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

我的模式:

我的索引:

我把所有东西都设置为索引,但它仍然运行得很慢。索引是否太多?还不够


程序本质上是先进行选择,然后进行插入并重复。

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

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

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

还要去掉LIKE子句中的前导“%”


最好的办法是获取执行计划,并查看它为什么慢(您可以在执行计划中发布另一个问题。可能会在dba堆栈交换中获得更好的结果)。

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

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

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

还要去掉LIKE子句中的前导“%”


最好的办法是获取执行计划并查看它为什么慢(您可以在执行计划中发布另一个问题。可能会在dba堆栈交换中获得更好的结果)。

类似“%whatever%”的列
不能使用索引。怎么可能呢?因此,它将恢复为完全扫描

另一方面,体面的SQL数据库能够为
列使用索引,如“whatever%”
,这在您的情况下可能更为相关


除此之外,您可能还需要在scheme/host/path中拆分URL并将其标准化,以便轻松获取给定主机的所有请求。此外,URL的255个字符限制也会给您带来麻烦。

像“%whatever%”这样的列不能使用索引。怎么可能呢?因此,它将恢复为完全扫描

另一方面,体面的SQL数据库能够为
列使用索引,如“whatever%”
,这在您的情况下可能更为相关


除此之外,您可能还需要在scheme/host/path中拆分URL并将其标准化,以便轻松获取给定主机的所有请求。此外,URL的255个字符限制也会给您带来麻烦。

那么您认为我应该将所有插入内容组合在一起吗?批量插入可能会对您有所帮助。那么您认为我应该将所有插入内容组合在一起吗?批量插入可能会对您有所帮助。您是说有3列可以拆分URL?至少,但我会更进一步,使用多个表,至少一个用于主机(可能包括方案)和一个用于引用主机表的URL。然后可以在主机id、路径和主机id上添加多列索引,dateChecked@User,如果答案对你有帮助,请随意投票和/或接受。你是说有3列可以将URL拆分?至少,但我会更进一步,使用多个表,至少一个表用于主机(可能包括scheme)一个用于引用主机表的URL。然后可以在主机id、路径和主机id上添加多列索引,dateChecked@User,如果答案对你有帮助,请随意投票和/或接受。