接着上面文章内容对数据页的详细介绍以及聚集索引原理的了解【Mysql】 InnoDB引擎深入 - 数据页 | 聚集索引,有了这个知识前提,对了解二级索引、联合索引等相关内容的理解就变得非常简单了。
二级索引(又名辅助索引、普通索引、非聚集索引),叶子节点不包含行记录的全部数据。叶子节点除了键值(索引建)之外,每个叶子节点中还包含了一个书签,该书签就是用来告诉引擎哪里可以找到该条记录的所有行数据,在InnoDB中该书签就是聚集索引建一般来说也就是聚集索键。
通俗来说,二级索引跟聚集索引有着一样的树结构,根据索引建顺序构建索引树(如果是字符性字段会根据不同的字符集运算后进行排序,所以字符集不一致的字段或表,可能会导致索引失效),不同的是其叶子节点不包括行记录所有数据,只有定义的索引键以及聚集索引键(通常就是主键),目的就是通过二级索引树查询时,首先查到的并不是行数据,而是该行的聚集索引建,然后通过该聚集索引键通过 聚集索引树 查找行数据。
回表:像上述描述的当一个sql查询时,需要两个索引树进行查找时,这样的过程被称为回表。所以中尽量减少回表过程也是一种优化手段。
索引覆盖(覆盖索引):那为了减少回表过程,可以进行索引覆盖,也就是说只通过一个索引树就能拿到需要的数据。比如 select * 修改为 select aa 而 aa就是二级索引,这样就可以直接在二级索引叶子中拿到需要的字段,从而不需要再次进行回表操作,那这样的情况为称为索引覆盖,或者叫覆盖索引。
联合索引: 联合索引也属于二级索引,只是它可以定义多个键组合使用,也就是对表上多个列进行索引。主要注意的是:因为索引需要根据顺序来完成索引树的建立,所以多个字段必须按照从左到右的顺序进行排序,这也就是常说的最左前准原则。
比如: 1-1-1 (A,B,C 三个字段)
1-2-2
2-3-2
这样的字段三个字段的组合,必须现根据A排序后,才能对B进行排序,A,B都确定顺序后才能对C进行排序。因此在使用联合索引时一定要遵循最左前缀原则,比如 where A = * 、where A = * AND B = * 可以使用索引,但是 where B = * .... 是会索引失效,因为在没有确定A的情况下,B也是无须的,而索引原理就是通过顺序进行树的查询。