在SQL中是否存在索引会有害的情况?

时间:2014-11-13 16:43:37

标签: sql indexing

索引能否受到伤害?那是我的全部问题。我很好奇。

2 个答案:

答案 0 :(得分:3)

查询优化器将简单地忽略与查询无关的索引。但是在查询优化期间,考虑是否应该使用每个索引,它们仍然需要花费几微秒。

表上的索引越多,优化程序分析的工作就越复杂,哪个是最好的。在极少数情况下,优化阶段实际上可能比查询执行成本更高。

我最近帮助客户使用MySQL 5.6,其中一些新的复杂查询优化功能导致查询在优化期间使用100%CPU。基本上,它导致优化器估计数千种索引选择的排列的好处,就像国际象棋游戏程序展望未来几项动作。

为了解决这个问题,我们有效地更改了一些配置变量,以使MySQL 5.6的优化器跳过它的新功能,并且对于最佳索引选择很笨,就像在MySQL 5.5中一样。在这种情况下,这解决了CPU峰值问题。

这种情况很特殊,因为查询非常复杂,而且它们有很多索引。

此案例也非常特定于一个品牌的RDBMS的一个版本。但其他品牌的数据库可能有类似的边缘情况。

答案 1 :(得分:1)

是的,索引会受到伤害。首先,在插入,更新和删除期间维护索引会产生开销。这种开销可能是有害的,特别是在大容量事务环境中。

索引也可能使用不当。例如,以下查询可能很难优化:

select t.*
from table t
where col1 > 'x'
order by col2

当有两个索引时,一个在col1上,另一个在col2上。

一种方法是使用col1索引来获取所有适当的行。然后使用order by的排序。另一种方法是使用col2索引进行排序,然后一次过滤一行。

哪种方法更好取决于数据,优化器总是很难做出正确的决策。这种情况下,使用第二个索引可能意味着错误的索引用于优化。

通常,索引确实有助于查询优化,对于许多系统来说,维护它们的额外开销可以忽略不计。但是,这并不意味着他们总是乐于助人。