关于二级索引的一些个人理解

  二级索引是相对于聚簇索引而言的。mysql中innodb引擎会在表创建的时候自动生成一个聚簇索引而二级索引则不会当然二级索引也是有一棵属于自己的B+树的。我们可以把聚簇索引理解成系统定义的索引而二级索引则是用户可以自定义的索引。

 

  二级索引和聚簇索引还是有些区别的例如:聚簇索引在叶子节点中维护的是行号和用户的真实记录信息而二级索引则是行号和主键值。在查找过程中因为二级索引的叶子节点中存放的是主键值所以还需要根据主键值去聚簇索引中做一次回表操作,所以二级索引的效率相对聚簇索引而言还是要低一些的,但同样二级索引的维护成本也要比聚簇索引低一些,因为二级索引中存放的是主键值而不是用户的真实记录,只有当主键值发生变化的时候二级索引才需要做一些变动而用户真实记录中的其它非主键值发生变化时二级索引是不需要变动的。


  二级索引的查找:二级索引的查找方式和聚簇索引是类似的只要符合索引的使用规则二级索引也会采用二分法去逐层的完成查找操作然后根据查找到的主键值去聚簇索引中进行回表操作也就是说二级索引要想获得一条完整的用户记录需要使用到两棵B+树。

 

  二级索引的编辑:当编辑操作发生时只有影响到主键值的操作才会对二级索引进行改动。

 

  二级索引中的联合索引:既然二级索引是可以支持用户自定义的那么我们在创建索引时列值可以是单列也可以是多列,多列的时候就叫做联合索引。

 

  联合索引注意事项:在使用联合索引的时候我们需要注意到最左前缀原则,这个是为mysql中二级索引树中搜索的时候提供支持的,如果是范围查找(<、>、between、like)或者不遵循最左前缀原则的时候会导致索引搜索的时候没法准确的定位到具体的记录则会导致索引使用失败。这里需要说下order by 、group by他们其实也是可以用到联合索引的但是需要他们的顺序和联合索引的顺序保持一致或者where条件+排序顺序保持一致因为这样可以减少explain中file sort的操作从而提高整体检索的效率。这也是联合索引的一个好处可以减少表中数据的重排。因为联合索引在B+树中的存放是排好顺序的(逻辑上的连续)

posted @ 2020-03-30 21:33  茴香饺子、  阅读(2761)  评论(1编辑  收藏  举报