索引,为什么不对所有内容进行索引,何时使用索引?

9

索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后读取整个表以查找相关行。

这是我们心爱的MySQL手册所说的。

在这种情况下,为什么不对每个列都建立索引呢?

由于我有这种感觉,它会对性能造成更大的影响,那么我们应该在什么时候使用索引/索引的最佳实践

提前致谢!


4
可能是索引的 DOs 和 DONTs的重复问题。 - Denis de Bernardy
3个回答

15

创建索引总是会付出代价:在一张表上拥有的索引越多,修改该表的代价就越大(即插入、更新和删除需要更长时间)。

反之,可以使用索引的查询将更快。这是一个经典的权衡考虑。在大多数表上,一小部分常用的索引值得成本,因为查询频繁(或者它们的性能比修改性能更重要)。

另一方面,如果你有某种非常频繁更新但很少查询的日志表(例如在灾难性故障时),添加索引将增加很大的成本并提供非常少的好处。

此外: 索引是否有用很大程度上取决于要执行的确切查询。可能您拥有覆盖每个列的索引,但是查询无法使用它们,因为索引顺序错误、信息错误或格式错误。因此,并不是所有索引都适用于所有查询。


“插入、更新和删除需要更长时间”,这是否意味着选择操作会更快,而这三个操作会更慢? - Anirudha Gupta
1
@Gupta:是的,那正是它的意思。 - Joachim Sauer

1
根据你的逻辑,你不会只索引每一列,而是每一列的每个排列组合。存储这些信息所涉及的开销以及保持其最新状态的开销将是极其巨大的。

1

通常,索引在具有良好选择性时非常有用,即当查询基于索引属性的值(或范围)选择少量数据时。

此外,当通过连接属性在两个连接表中对行进行排序时,索引对于合并连接也很有用,这样可以匹配行并在一次检索中检索数据。

正如已经提到的那样,索引会减慢更新速度并占用一些内存(这本身也会降低性能)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接