码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • MySQL进阶-覆盖索引


    前文我们讲解了索引失效的原则。已经索引要遵循最左前缀法则。

    覆盖索引

    原则:尽量使用覆盖索引,减少select *的使用。

    那么什么是覆盖索引呢? 覆盖索引是指查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到 。

    接下来,我们来看一组SQL的执行计划,看看执行计划的差别,然后再来具体做一个解析。

    1. explain select id, profession from tb_user where profession = '软件工程' and age =
    2. 31 and status = '0' ;
    3. explain select id,profession,age, status from tb_user where profession = '软件工程'
    4. and age = 31 and status = '0' ;
    5. explain select id,profession,age, status, name from tb_user where profession = '软件工程' and age = 31 and status = '0' ;
    6. explain select * from tb_user where profession = '软件工程' and age = 31 and status
    7. = '0';

    这些sql主要的不同在于,select查询结果的不同

    • 第一个sql:id,profession

    • 第二个sql:id,profession,age,status

    • 第三个sql:id,profession,age,status,name

    •  第四个sql:*

     

     我们可以看出后两个Extra是null并不是前面两个的Using Index。

    Extra含义
    Using Index查找使用了索引,但是需要的数据都在索引列中能找到,所以不需 要回表查询数据
    Null查找使用了索引,但是需要回表查询数据
    • 因为,在tb_user表中有一个联合索引 idx_user_pro_age_sta,该索引关联了三个字段 profession、age、status,而这个索引也是一个二级索引,所以叶子节点下面挂的是这一行的主 键id。 所以当我们查询返回的数据在 id、profession、age、status 之中,则直接走二级索引 直接返回数据了。
    • 如果超出这个范围,就需要拿到主键id,再去扫描聚集索引,再获取额外的数据 了,这个过程就是回表。 而我们如果一直使用select * 查询返回所有字段值,很容易就会造成回表 查询(除非是根据主键查询,此时只会扫描聚集索引)。

    因此覆盖索引,就是建立的索引包含了,要查找的全部字段

    聚集索引是主键建立的,数据中包含了一行的全部内容。

     

     

     因此我们写sql语句和建立索引时,应该避免回表扫描带来的影响。

     

     

  • 相关阅读:
    设计模式-建造者(生成器)模式
    平衡二叉树(AVL)【java实现+图解】
    代码规范工具
    PHP Warning: Module ‘curl‘ already loaded in Unknown on line 0
    论文解读:PromptBERT: Improving BERT Sentence Embeddings with Prompts
    java毕业设计——基于java+Applet+access的综合测评系统设计与实现(毕业论文+程序源码)——综合测评系统
    【网络协议】聊聊网关 NAT机制
    RDB与AOF持久化【Redis】及缓存雪崩、击穿、穿透
    【云原生 | Kubernetes 系列】---Prometheus监控Nginx
    Fiddler 进行接口测试
  • 原文地址:https://blog.csdn.net/abc123mma/article/details/127817716
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号