1.什么是覆盖索引和回表查询
首先,我们看看mysql的索引类型,mysql包括两种索引类型,聚集索引和非聚集索引:
聚集索引(主键索引):
聚集索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的即为整张表的记录数据。
聚集索引的叶子节点称为数据页,聚集索引的这个特性决定了索引组织表中的数据也是索引的一部分。
辅助索引(二级索引):
非主键索引,叶子节点=键值+书签。Innodb存储引擎的书签就是相应行数据的主键索引值。
关于聚集索引说明如下:
- 每个表必须且只能有一个聚集索引,如果设置主键,那么主键就是聚集索引
- 非聚集索引,比如普通索引,都是通过B+ tree的检索后,叶子节点包含主键id,再去聚集索引寻找记录,因为聚集索引的叶子节点,包含所有行记录信息
- 如果没有设置聚集索引,mysql会默认生成rowid作为聚集索引
说到这里,我们来看什么是覆盖索引和回表查询,比如下面的表结构:
create table `t_member` ( `id` int (11), `member_no` varchar (36), `user_name`