美文网首页
四、索引覆盖

四、索引覆盖

作者: _sleeping | 来源:发表于2018-08-07 11:03 被阅读10次

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

例如表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)大字段,两条查询语句效率也是差不多的

相关文章

  • 四、索引覆盖

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

  • 覆盖索引

    覆盖索引 基础解释 查看方法 使用条件 优点

  • 覆盖索引

    覆盖索引 覆盖索引(covering index)指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取。...

  • 覆盖索引

    覆盖索引 1、当发起一个被索引覆盖的查询时,在explain的extra列可以看到using index的信息,此...

  • index pushdown

    表结构 索引覆盖 索引下推

  • 辅助索引种类细分

    单列的辅助索引 联合多列辅助索引(覆盖索引) 唯一索引

  • mysql唯一索引 覆盖索引

    当mysql唯一索引是组合索引时,如果查询条件满足组合索引的覆盖条件,同样将是覆盖索引。 测试:新建表t: 添加唯...

  • MySQL覆盖索引

    MySQL覆盖索引 1.定义: 一个索引包含(或者覆盖)所有需要查询的字段

  • 什么是覆盖索引和回表吗?

    覆盖索引指的是在⼀次查询中,如果⼀个索引包含或者说覆盖所有需要查询的字段的值,我们就称之为覆盖索引,⽽不再需要回表...

  • MySQL索引

    MySQL索引 索引介绍 索引原理与分析 组合索引 索引失效分析 索引介绍 什么是索引索引:包括聚集索引、覆盖索引...

网友评论

      本文标题:四、索引覆盖

      本文链接:https://www.haomeiwen.com/subject/tcyovftx.html