主索引与二级索引:性能差异

sat*_*y78 1 mysql database-performance database-indexes

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

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

非常感谢

Bra*_*vic 8

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

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

这意味着聚簇表中的二级索引比基于堆的表中的二级索引“更胖”,后者:

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

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

这很遗憾,因为 MySQL 不允许您独立于存储引擎选择集群。