丁奇的MySQL基础课
林晓斌(网名“丁奇”)
前阿里资深技术专家
立即订阅
4 人已学习
课程目录
已完结 6 讲
01 | 基础架构:一条SQL查询语句是如何执行的?
免费
02 | 日志系统:一条SQL更新语句是如何执行的?
03 | 事务隔离:为什么你改了我还看不见?
04 | 深入浅出索引(上)
05 | 深入浅出索引(下)
06 | 全局锁和表锁 :给表加个字段怎么有这么多阻碍?
丁奇的MySQL基础课
登录|注册

05 | 深入浅出索引(下)

林晓斌 2019-08-09
在上一篇文章中,我和你介绍了 InnoDB 索引的数据结构模型,今天我们再继续聊聊跟 MySQL 索引有关的概念。
在开始这篇文章之前,我们先来看一下这个问题:
在下面这个表 T 中,如果我执行 select * from T where k between 3 and 5,需要执行几次树的搜索操作,会扫描多少行?
下面是这个表的初始化语句。
mysql> create table T (
ID int primary key,
k int NOT NULL DEFAULT 0,
s varchar(16) NOT NULL DEFAULT '',
index k(k))
engine=InnoDB;
insert into T values(100,1, 'aa'),(200,2,'bb'),(300,3,'cc'),(500,5,'ee'),(600,6,'ff'),(700,7,'gg');
图 1 InnoDB 的索引组织结构
现在,我们一起来看看这条 SQL 查询语句的执行流程:
在 k 索引树上找到 k=3 的记录,取得 ID = 300;
再到 ID 索引树查到 ID=300 对应的 R3;
在 k 索引树取下一个值 k=5,取得 ID=500;
再回到 ID 索引树查到 ID=500 对应的 R4;
在 k 索引树取下一个值 k=6,不满足条件,循环结束。
在这个过程中,回到主键索引树搜索的过程,我们称为回表。可以看到,这个查询过程读了 k 索引树的 3 条记录(步骤 1、3 和 5),回表了两次(步骤 2 和 4)。
在这个例子中,由于查询结果所需要的数据只在主键索引上有,所以不得不回表。那么,有没有可能经过索引优化,避免回表过程呢?

覆盖索引

如果执行的语句是 select ID from T where k between 3 and 5,这时只需要查 ID 的值,而 ID 的值已经在 k 索引树上了,因此可以直接提供查询结果,不需要回表。也就是说,在这个查询里面,索引 k 已经“覆盖了”我们的查询需求,我们称为覆盖索引。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《丁奇的MySQL基础课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(9)

  • 几米阳光
    a和b联合主键即a和b上有联合索引,则a作为ab索引的前缀是可以索引且按a排序的,所以当在c上创建索引后,即c和a上都有索引,所以ca联合索引是多余的,cb索引是需要的
    2019-08-19
    1
    10
  • 明翼
    请教下,mysql数据库的数据是按照行一行行存储的吗?还是怎么存储的那?
    2019-08-13
    2
    1
  • 有点过分,但是
    两个查询都是基于where c = N,c本身是有索引的其次在order by b的时候,是存在c,b的联合索引,mysql5.6及以上会自动根据索引下推排序;其次是另一个order by a的,a本身有另一个索引,且a在最左侧,是可以利用(a,b)索引树的。
    2019-09-22
  • 平淡
    mysql的非唯一索引,在索引值相等的情况下,在B+树叶子节点的排序,会受到主键值的影响吗?
    2019-09-20
  • 大海贼
    覆盖索引和索引下推
    2019-09-20
  • JasonLong
    因为有ca,cb索引,不需要一个单独的c索引。
    不做任何操作的话,用的全表扫描,只是可能用到索引还有filesort,当我删除索引c之后,直接使用ca或者cb索引,扫描行数减少,使用了索引效率提升。
    2019-08-20
  • 谷鱼
    主键是为查询更多数据,排序不需要单独处理主键
    2019-08-16
  • 滴滴
    不用,看文章的意思应该会做索引下推优化,减少回表次数,如果加了索引c的话反而增加了回表次数,不知道理解的对吗
    2019-08-15
  • 明翼
    我觉得那个同事说的没有道理,ca和cb的联合索引也只会对c字段值排序,不会对a或b排序,所以算是多建了两个索引。
    2019-08-13
    1
收起评论
9
返回
顶部