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

时间:2012-05-03 08:39:11

标签: mysql database-performance database-indexes

我有一个小问题:主要和次要索引之间的性能差异是什么?造成这种差异的原因是什么?

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

非常感谢

1 个答案:

答案 0 :(得分:4)

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

对于Oracle,MS SQL Server也是如此,并且是also true for InnoDB

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

  • 降低了数据集群,
  • 降低了缓存的效率,
  • 使维护成本更高,
  • 最重要的是,它会对查询性能产生影响:
    • 查询二级索引可能需要双重查找 - 一次查找二级索引以查找“密钥”数据,一次查找主要文件,以查找行本身(Oracle有一些有趣的优化以避免第二次查找,但是据我所知,InnoDB没有。
    • 另一方面,辅助索引自然会增加covers个字段,因此在传统的基于堆的索引需要表访问的情况下,可以完全避免第二次查找。但是,通过简单地向其添加更多字段,可以在基于堆的索引中实现相同的效果。

让我引用Use The Index, Luke!“索引组织表和聚簇索引的优点主要限于不需要第二个索引的表。”

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