四、索引覆盖

索引覆盖是指 如果查询的列恰好是索引的一部分,那么查询只需要在索引文件上进行,不需要回到磁盘查找数据。这种查询速度非常快,成为索引覆盖

例如表user

CREATE TABLE `user` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `name` varchar(20) NOT NULL,

  `desc` varchar(100) NOT NULL,

  PRIMARY KEY (`id`),

  KEY `id_name` (`id`,`name`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;

当 select name from user where id>3;时,因为name即为索引的一部分所有直接在索引上就可以查到数据

而当 select desc form user where id>3时,则需要回行到磁盘读取数据

经典案例

create table `user`(

    `id` int(11) auto_increment,

    `name` varchar(20),

    `desc` varchar(3000),

    `extra` varchar(3000),

    primary key (`id`),

    key id_name(`id`,`name`)

)

疑问:select id from user order by id为什么非常慢,

          而select id from user order by id,name 反而很快,

          两个语句都有索引覆盖,正常应该都很快

解析:

1.这个表用的引擎是innodb,因为innodb主键索引是聚簇索引,主键索引上存放了行数据,而该表中有几个大数据字段,主键索引id需要在磁盘跨n多块,导致查询很慢。而id,name联合索引为次索引,指向主键的引用,不存放行数据,所以查询较快。

2.如果是myisam引擎则两条语句的查询数据应该差不多,因为myisam引擎是非聚餐索引,索引只存放行数据的位置。

3.即使该表的引擎为innodb,如果没有那几个varchar(3000)大字段,两条查询语句效率也是差不多的

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容