索引能否受到伤害?那是我的全部问题。我很好奇。
答案 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
索引进行排序,然后一次过滤一行。
哪种方法更好取决于数据,优化器总是很难做出正确的决策。这种情况下,使用第二个索引可能意味着错误的索引用于优化。
通常,索引确实有助于查询优化,对于许多系统来说,维护它们的额外开销可以忽略不计。但是,这并不意味着他们总是乐于助人。