主索引与辅助索引:性能差异

9 浏览
0 Comments

主索引与辅助索引:性能差异

我有一个小问题:主索引和次要索引的性能差异是什么?是什么导致了这种差异?

我在网上搜索了一下,发现次要索引是存储在另一张表中的,所以这会减缓所有操作的速度..但是还有其他原因可以解释这种性能下降吗?

非常感谢。

0
0 Comments

主索引和次索引之间的性能差异是由于聚簇表的物理结构和索引的设计引起的。聚簇表是一个B-树,没有"堆"部分-行直接存储在聚簇索引(主键)的B-树结构中。B-树的节点可以被拆分或合并,因此行的物理位置可以改变,因此我们不能简单地通过次索引指向行的指针,所以次索引必须包含主索引字段的完整副本,以能够可靠地标识行。

这对于Oracle、MS SQL Server和InnoDB来说都是正确的。

这意味着聚簇表中的次索引比基于堆的表中的次索引更"臃肿",这会降低数据聚集性,降低缓存的效果,使其维护成本更高,并且最重要的是,对查询性能有影响:

- 通过次索引查询可能需要进行两次查找-一次通过次索引查找"键"数据,一次通过主索引查找行本身(Oracle有一些有趣的优化措施可以避免第二次查找,但据我所知,InnoDB没有)。

- 另一方面,次索引自然地涵盖更多字段,因此可以完全避免第二次查找,而传统的基于堆的索引则需要访问表。然而,通过简单地向基于堆的索引添加更多字段,也可以实现相同的效果。

正如《Use The Index, Luke!》中所引用的:“索引组织表和聚簇索引的优势主要限于不需要第二个索引的表。”这是令人遗憾的,因为MySQL不允许您单独选择聚簇索引而不选择存储引擎。

聚簇表的主索引和次索引之间存在性能差异的原因是聚簇表的物理结构和索引的设计。要解决这个问题,可以考虑选择适合的存储引擎,或者通过添加更多字段来增加基于堆的索引的覆盖度,从而避免第二次查找的开销。

0