简介
mysql的innodb引擎查询时无法使用索引覆盖的场景下,需要做回表操作获取记录所需要的字段。Innodb有两大类索引,一类是集聚索引(Clustered Index),一类是普通索引(Secondary Index)。
聚集索引决定了数据库的物理存储结构,而主键只是确定表格逻辑组织方式。这两者不可混淆!
- 如果一个主键被定义了,那么这个主键就是作为聚集索引
- 如果没有主键被定义,那么该表的第一个唯一非空索引被作为聚集索引
- 如果没有主键也没有合适的唯一索引,那么innodb内部会生成一个隐藏的主键作为聚集索引ROWID,这个隐藏的主键是一个6个字节的列,改列的值会随着数据的插入自增。
- 自增主键会把数据自动向后插入,避免了插入过程中的聚集索引排序问题。聚集索引的排序,必然会带来大范围的数据的物理移动,这里面带来的磁盘IO性能损耗是非常大的。
而如果聚集索引上的值可以改动的话,那么也会触发物理磁盘上的移动,于是就可能出现page分裂,表碎片横生。所以不应该修改聚集索引。
select * from t where name = 'lisi';
要注意的是,不是所有类型的索引都可以成为覆盖索引的,因为覆盖索引必须要存储索引的列值,而哈希索引,空间索引和全文索引都不存储索引列值,索引Mysql只能使用B-tree索引做覆盖索引。
3.一些存储引擎比如MyISAM在内存中只缓存索引,数据则依赖操作系统来缓存,因此要访问数据的话需要一次系统调用,使用覆盖索引则避免了这一点。
4.由于InnoDB的聚簇索引,覆盖索引对InnoDB引擎下的数据库表特别有用。因为InnoDB的二级索引在叶子节点中保存了行的主键值,如果二级索引能够覆盖查询,就避免了对主键索引的二次查询。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/177523.html原文链接:https://javaforall.net
