• 什么是覆盖索引?


    前言

     

    要搞明白覆盖索引首先就得明白主键索引辅助索引的区别,以及查询时引擎的工作方式。

    当然,以上都是基于innoDB引擎来说。

    主键索引与辅助索引的区别

    相信大家也了解过这方面的知识,这里就不展开了,直接上总结。

    主键索引

    叶子节点保存数据

    辅助索引

    叶子节点保存主键值

    查询一条数据是如何工作的呢

    先说查询过程:

    由于辅助索引只存储主键的值,如果使用辅助索引搜索数据就必须先从辅助索引取到主键的值,再使用主键的值去主键索引上查询,直到找到叶子节点上的数据返回。 ---- 这个也称之为回表

    那么如何避免**回表**查询的发生呢?

    如果辅助索引上已经存在我们需要的数据,那么引擎就不会去主键上去搜索数据了。 ---- 这个就是所谓的"**覆盖索引**"

    接下来我们来证明一下它。

    回表查询

    假如有这样一张表:

    复制代码
    CREATE TABLE `test` (
      `id` int(11) NOT NULL,
      `age` int(11) NOT NULL,
      `name` varchar(255) NOT NULL DEFAULT '',
      PRIMARY KEY (`id`),
      KEY `idx_age_name` (`age`,`name`) USING BTREE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    复制代码

    我们给age添加一个索引, 接下来随意插入几条数据

     
    insert into test(`id`,`age`,`name`) VALUES(1,10,"小明"),(2,11,"小红"),(3,12,"小伟");

    查询一条数据

     
     
    select * from test where age = 10

     

     

    查看一下耗时

     

     

    分析一下语句:

     

    desc select * from test where age = 10

     

    查看执行计划:

     

     

    可以看到extra列为空,key则使用了idx_age索引, 大致的查询耗时在0.024秒左右。

     

    这样的查询速度快吗?

     
    我说我还能再优化一下,你敢信吗? - 鲁迅(我没说过)

     

    覆盖索引

     

    只需要稍微改变一下查询的字段, 我们就发现其中的区别了。

     
    select age,name from test where age = 10
     

    查看一下耗时:

     

     

     

    可以看到耗时减少了!

     

    发生了什么呢,我们再来分析一下语句

     
     
    desc select age,name from test where age = 10

     

     

    可以看到extra列有一个 *using idnex* , 这个的意思就是使用了覆盖索引,无需回表查询了。

     

    总结

    只从辅助索引要数据。那么, 普通索引(单字段)和联合索引,以及唯一索引都能实现覆盖索引的作用。
  • 相关阅读:
    Jetson系列设置Python脚本开机自启
    前端进击笔记第二十五节 通过前端工程化提升团队开发效率
    爬取基金收盘价并用pyecharts进行展现
    《canvas》之第7章 变形操作
    Hydro-bzoj,你用过吗?
    关键字 internal
    c++替换字符的方法
    一张图快速了解 Istio 的 EnvoyFilter
    NC14745 Hungry!
    英特尔旗下Mobileye纳斯达克上市:上涨38% 市值231亿美元
  • 原文地址:https://www.cnblogs.com/xiaotian0422/p/17679749.html