美文网首页
三. 覆盖索引的原理

三. 覆盖索引的原理

作者: JensenXie | 来源:发表于2023-03-08 13:14 被阅读0次

    覆盖索引就是需要查询的列正好也在索引叶子节点上,可以避免回表的操作,极大的提高了查询性能,当数据量比较大时,查询效率是很明显的。

    当我们SELECT *时,会把所有列查询出来,但是实际运用中我们可能只需要用到个别的几个列,这样会特别的浪费资源,在这种情况下,我们就可以使用到覆盖索引解决这样的问题,因为覆盖索引中的叶子节点包含你所需要查询的列可以直接返回从而不需要回表操作,下面我们用具体的实例看看吧~。

    我们创建一张用户表:


    user_test表

    目前我们在没有创建任何索引的情况下用age字段查询一下。

    EXPLAIN SELECT age FROM user_test WHERE age = 12;
    
    无索引查询根据age查询age字段

    在没有索引的情况下,该查询是自动扫描全表,把条件为age=12的筛选出来,非常消耗I/O资源,下面我们给age字段添加索引做一下优化。

    ALTER TABLE `user_test` add index age(age);
    

    在为age添加索引后我们再次进行查询。


    添加age索引后的查询

    此时SQL语句用到了age的索引,并且通过Extra=using index可以看出还用到了覆盖索引,因为当我们给age创建普通索引的时候形成了一颗以age字段排序的B+tree,叶子节点保存了age的值,所以当查询列包含了索引的值就可以用了覆盖索引,不需要进行回表操作。下面我们换成查询所有列就会发现此时用不到覆盖索引了,必须要回到聚簇索引中查找对应的行,也就是我们通常说的回表。


    通过索引age查询所有
    type=ref并且Extra=NULL说明没有任何额外的执行信息,说明该条查询没有使用到覆盖索引,从而进行了回表操作。

    相关文章

      网友评论

          本文标题:三. 覆盖索引的原理

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