1

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

我在谷歌搜索,我发现二级索引存储在另一个表中,所以这会减慢所有操作。但是还有其他一些原因可以证明性能下降是合理的?

非常感谢

4

1 回答 1

8

聚集表是没有“堆”部分的 B-Tree - 行直接存储在聚集索引(主键)的 B-Tree 结构中。B-Tree 的节点可以拆分或合并,因此物理位置或行可以改变,所以我们不能有一个从二级索引到行的简单“指针”,所以二级索引必须包含完整的副本能够可靠地识别行的主索引字段。

这适用于 Oracle、MS SQL Server,也适用于 InnoDB

这意味着聚集表中的二级索引比基于堆的表中的二级索引“胖”,其中:

  • 降低数据聚类,
  • 降低缓存的有效性,
  • 使它们的维护成本更高,
  • 最重要的是,对查询性能有影响:
    • 通过二级索引查询可能需要双重查找——一次通过二级索引查找“关键”数据,另一次通过主索引查找行本身(Oracle 有一些有趣的优化可以避免二次查找,但 InnoDB 没有, 据我所知)。
    • 另一方面,二级索引自然会覆盖更多字段,因此在传统的基于堆的索引需要表访问的情况下,可以完全避免第二次查找。但是,在基于堆的索引中也可以实现相同的效果,只需向其添加更多字段即可。

让我引用使用索引,卢克!“索引组织表和聚集索引的优势大多仅限于不需要第二个索引的表。”

真可惜,因为 MySQL 不允许您独立于存储引擎选择集群。

于 2012-05-23T12:41:39.820 回答