mysql主要有两大存储引擎,innodb和myIsam
两大引擎的底层索引实现也有区别。
innodb: 主要是聚集索引和辅助索引
聚集索引,实现是将主键id作为索引,以B+树的结构存储,叶子节点存储的是整条id以及其对应的表记录,id唯一,每次通过id走索引直接查到对应的记录,效率最高;
辅助索引,以某个字段作为索引,以B+树结构存储,叶子节点存的是字段值以及对应的id主键,根据字段索引查到id,再根据id主键索引查到对应记录,走了两边,效率较低;
myIsam:非聚集索引
非聚集索引,将 数据 与 索引 分开存储,表数据存储顺序与索引顺序无关。
主键id的索引是以B+树结构存储,叶子节点存放的是id和对应的表记录内存地址,通过id索引查到表记录地址,再找到对应记录;
效率对比:聚簇索引>非聚簇索引>辅助索引
mysql 覆盖索引
如果一个索引包含(或覆盖)所有需要查询的字段的值,成为覆盖索引。即只需扫描索引而无须回表。
只扫描索引而无需回表的优点:
1.索引条目通常远小于数据行大小,只需要读取索引,则mysql会极大地减少数据访问量。
2.因为索引是按照列值顺序存储的,所以对于IO密集的范围查找会比随机从磁盘读取每一行数据的IO少很多。
3.一些存储引擎如myisam在内存中只缓存索引,数据则依赖于操作系统来缓存,因此要访问数据需要一次系统调用
4.innodb的聚簇索引,覆盖索引对innodb表特别有用。(innodb的二级索引在叶子节点中保存了行的主键值,所以如果二级主键能够覆盖查询,则可以避免对主键索引的二次查询)