合理设计并利用索引(二)

67 阅读3分钟

索引的利弊与如何判定是否需要索引

相信每一位都知道索引能够极大的提高我们数据检索的效率,让我们的 Query 执行的更快,但是可能并不是每一位朋友都清楚索引在极大提高检索效率的同时,也给我们的数据库带来了一些负面的影响。下面我们就分别对 MySQL 中索引的利与弊做一个简单的分析。

索引的利处

索引能够给我们带来的最大益处可能读者朋友基本上都有一定的了解,但是我相信并不是每一位读 者朋友都能够了解的比较全面。很多朋友对数据库中的索引的认识可能主要还是只限于“能够提高数据 检索的效率,降低数据库的 IO 成本”。

确实,在数据库中个表的某个字段创建索引,所带来的最大益处就是将该字段作为检索条件的时候 可以极大的提高检索效率,加快检索时间,降低检索过程中所需要读取的数据量。但是索引所给我们带 来的收益只是提高表数据的检索效率吗?当然不是,索引还有一个非常重要的用途,那就是降低数据的 排序成本。

我们知道,每个索引中索引数据都是按照索引键键值进行排序后存放的,所以,当我们的 Query 语 句中包含排序分组操作的时候,如果我们的排序字段和索引键字段刚好一致,MySQL Query Optimizer 就会告诉 mysqld 在取得数据之后不用排序了,因为根据索引取得的数据已经是满足客户的排序要求。 那如果是分组操作呢?分组操作没办法直接利用索引完成。但是分组操作是需要先进行排序然后才 分组的,所以当我们的 Query 语句中包含分组操作,而且分组字段也刚好和索引键字段一致,那么 mysqld 同样可以利用到索引已经排好序的这个特性而省略掉分组中的排序操作。

排序分组操作主要消耗的是我们的内存和 CPU 资源,如果我们能够在进行排序分组操作中利用好索 引,将会极大的降低 CPU 资源的消耗。

索引的弊端

索引的益处我们都已经清楚了,但是我们不能光看到索引给我们带来的这么多益处之后就认为索引是解决 Query 优化的圣经,只要发现 Query 运行不够快就将 WHERE 子句中的条件全部放在索引中。确实,索引能够极大的提高数据检索效率,也能够改善排序分组操作的性能,但是我们不能忽略的一个问题就是索引是完全独立于基础数据之外的一部分数据。

假设我们在 Table ta 中的 Column ca 创建了索引idx_ta_ca,那么任何更新 Column ca 的操作,MySQL 都需要在更新表中 Column ca的同时,也更新 Column ca 的索引数据,调整因为更新所带来键值变化后的索引信息。而如果我们没有对 Column ca 进行索引的话,MySQL 所需要做的仅仅只是更新表中 Column ca 的信息。这样,所带来的最 明显的资源消耗就是增加了更新所带来的 IO 量和调整索引所致的计算量。此外,Column ca 的索引 idx_ta_ca 是需要占用存储空间的,而且随着 Table ta 数据量的增长,idx_ta_ca 所占用的空间也会不断增长。所以索引还会带来存储空间资源消耗的增长。