Mysql 主要索引与次要索引:性能差异
我有一个小问题:主要索引和次要索引之间的性能差异是什么?造成这种差异的原因是什么 我在谷歌上搜索,发现二级索引存储在另一个表中,所以这会降低所有操作的速度。。但是,还有其他一些原因可以证明这种性能下降的合理性Mysql 主要索引与次要索引:性能差异,mysql,database-performance,database-indexes,Mysql,Database Performance,Database Indexes,我有一个小问题:主要索引和次要索引之间的性能差异是什么?造成这种差异的原因是什么 我在谷歌上搜索,发现二级索引存储在另一个表中,所以这会降低所有操作的速度。。但是,还有其他一些原因可以证明这种性能下降的合理性 非常感谢聚集表是一个没有“堆”部分的B树-行直接存储在聚集索引(主键)的B树结构中。B-树的节点可以拆分或合并,因此物理位置或行可以更改,因此我们不能有从二级索引到行的简单“指针”,因此二级索引必须包含主索引字段的完整副本,以便能够可靠地标识行 Oracle、MS SQL Server和i
非常感谢聚集表是一个没有“堆”部分的B树-行直接存储在聚集索引(主键)的B树结构中。B-树的节点可以拆分或合并,因此物理位置或行可以更改,因此我们不能有从二级索引到行的简单“指针”,因此二级索引必须包含主索引字段的完整副本,以便能够可靠地标识行 Oracle、MS SQL Server和is都是如此 这意味着聚集表中的二级索引比基于堆的表中的二级索引“更胖”,后者:
- 降低了数据的聚集性
- 降低缓存的有效性
- 使它们的维护成本更高
- 最重要的是,它会对查询性能产生影响:
- 通过二级索引进行查询可能需要双重查找—一次通过二级索引查找以定位“键”数据,另一次通过主索引查找以定位行本身(据我所知,Oracle有一些有趣的优化以避免第二次查找,但InnoDB没有)
- 另一方面,二级索引自然会包含更多字段,因此在传统的基于堆的索引需要表访问的情况下,可以完全避免第二次查找。但是,在基于堆的索引中也可以实现同样的效果,只需向其添加更多字段即可
这很可惜,因为MySQL不允许您独立于存储引擎选择集群。集群表是一个没有“堆”部分的B树-行直接存储在集群索引(主键)的B树结构中。B-树的节点可以拆分或合并,因此物理位置或行可以更改,因此我们不能有从二级索引到行的简单“指针”,因此二级索引必须包含主索引字段的完整副本,以便能够可靠地标识行 Oracle、MS SQL Server和is都是如此 这意味着聚集表中的二级索引比基于堆的表中的二级索引“更胖”,后者:
- 降低了数据的聚集性
- 降低缓存的有效性
- 使它们的维护成本更高
- 最重要的是,它会对查询性能产生影响:
- 通过二级索引进行查询可能需要双重查找—一次通过二级索引查找以定位“键”数据,另一次通过主索引查找以定位行本身(据我所知,Oracle有一些有趣的优化以避免第二次查找,但InnoDB没有)
- 另一方面,二级索引自然会包含更多字段,因此在传统的基于堆的索引需要表访问的情况下,可以完全避免第二次查找。但是,在基于堆的索引中也可以实现同样的效果,只需向其添加更多字段即可
这很遗憾,因为MySQL不允许您独立于存储引擎选择集群。以下链接可能会为您提供一些信息:,非常感谢!现在我将阅读它们。以下链接可能会为您提供一些信息:,非常感谢!现在我来读一下。这篇关于使用索引的文章。卢克!非常好。在聚类索引和二级索引方面澄清了很多想法。谢谢上的帖子使用索引。卢克!非常好。在聚类索引和二级索引方面澄清了很多想法。谢谢