聚集索引、非聚集索引、覆盖索引、回表、索引下推都是什么?
聚集索引
- 聚集索引是将索引和数据(表中的一行数据)放在一个节点上的数据存储方式,我们将这种索引叫做聚集索引。
- 在innodb存储引擎中,只能有一个聚集索引,那就是和主键绑定在一起的行数据。
- 除了主键索引外的,其他类型的索引和数据存储的方式就是非聚集索引。
非聚集索引
- 除了上述的聚集索引外都是非聚集索引。
- 非聚集索引也叫做聚簇索引、辅助索引、二级索引。
- 非聚集索引存储着索引字段值。
覆盖索引
- 我们给user表创建一个联合索引把 name 和 age 组合成一个组合索引。
- select name,age from user where name='张三' and age ='18',我们这样的查找方式使用的就是覆盖索引。
- 我们所需要的字段都在一个非聚集索引上就全部查找到了,就不需要再回表查找聚集索引了。
回表
- 我们把上面的sql 改一下:
select id,class,teacher_id,name,age from user where name='张三' and age ='18';
- 我们前一个sql在组合索引上就能全部找到,现在不行了。要的太多了,所以会先通过条件定位出来数据的主键值。再通过主键值去聚集索引上匹配并拿到所有需要的数据。这个过程就是回表操作。
sql优化时,要减少回表操作。创建合适的索引。
索引下推
- 以联合索引 name、age、num (名字、年纪、学号)为联合索引。
- select * from user where name like 'zhang%' and age ='15' and num = '2022' 为例子
- 先通过联合索引的第一个字段name模糊 匹配到符合条件的数据。在mysql5.6之前都是用联合索引的第一个字段匹配完成后获取主键索引进行回表操作,然后再匹配后面两个条件。现在呢是使用索引下推,用第一个字段name 匹配后得到的结果在一次使用age、num字段过滤。缩小得到的id范围再进行回表操作。大大减少了回表的次数,提高了效率。