联合索引,回表,索引覆盖

联合索引,回表,索引覆盖今天学习到了一点知识 来做一下笔记 建立联合索引时 为什么要关注列的顺序 mysql 建立联合索引有最左前置原则 在建立联合索引时 根据需求 where 子句中使用最频繁的一列放在最左边 如何理解联合索引中遵守的最左前置原则 mysql 默认的存储引擎是 InnoDB InnoDB 使用 B 树 B 树的数据项是复合的数据结构 是按照从左到右的顺序来建立搜索树的 比如当 AA BB CC 这样的数据来检索的时候 b 树会优先比较 AA 来确定下一步的所搜方向

今天学习到了一点知识,来做一下笔记~


建立联合索引时,为什么要关注列的顺序?

mysql建立联合索引有最左前置原则,在建立联合索引时,根据需求,where子句中使用最频繁的一列放在最左边;

如何理解联合索引中遵守的最左前置原则?

mysql默认的存储引擎是InnoDB,InnoDB使用B+树,B+树的数据项是复合的数据结构,是按照从左到右的顺序来建立搜索树的。

比如当(AA,BB,CC)这样的数据来检索的时候,b+树会优先比较AA来确定下一步的所搜方向,如果AA相同再依次比较BB和CC,最后得到检索的数据;

但当(BB,CC)这样的没有AA的数据来的时候,b+树就不知道第一步该查哪个节点,因为建立搜索树的时候AA就是第一个比较因子,必须要先根据AA来搜索才能知道下一步去哪里查询。

当(AA,CC)这样的数据来检索时,b+树可以用AA来指定搜索方向,但下一个字段BB的缺失,所以只能把名字等于AA的数据都找到,然后再匹配CC这种情况无法用到联合索引。


什么是回表操作,索引覆盖的意义?

比如:建立了一个A,B联合索引,sql语句是 select A,B from table where A=?, B=?,此时想要搜索的A,B从索引数据中已经存在了,不用拿到id到表数据中去查找,此时便不会回表,这种现象就叫做索引覆盖。

现在把语句改为了 select A,B,C from table where A=?, B=?,C不在索引数据中,所以只能先拿到id再到表数据文件中搜索,这就是回表。


mysql里创建‘联合索引’的意义?

  1. “一个顶三个”。建了一个(a,b,c)的复合索引,那么实际等于建了(a),(a,b),(a,b,c)三个索引,因为每多一个索引,都会增加写操作的开销和磁盘空间的开销。对于大量数据的表,这可是不小的开销!
  2. 覆盖索引。同样的有复合索引(a,b,c),如果有如下的sql: select a,b,c from table where a=1 and b = 1。那么MySQL可以直接通过遍历索引取得数据,而无需回表,这减少了很多的随机io操作。减少io操作,特别的随机io其实是dba主要的优化策略。所以,在真正的实际应用中,覆盖索引是主要的提升性能的优化手段之一
  3. 索引列越多,通过索引筛选出的数据越少。有1000W条数据的表,有如下sql:select * from table where a = 1 and b =2 and c = 3,假设假设每个条件可以筛选出10%的数据,如果只有单值索引,那么通过该索引能筛选出1000W*10%=100w 条数据,然后再回表从100w条数据中找到符合b=2 and c= 3的数据,然后再排序,再分页;如果是复合索引,通过索引筛选出1000w *10% *10% *10%=1w,然后再排序、分页,哪个更高效,一眼便知
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/178775.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午4:31
下一篇 2026年3月26日 下午4:31


相关推荐

  • MT5和MT4交易软件有什么区别?

    MT5和MT4交易软件有什么区别?很多人说MT5从字面上看是MT4的升级版,但实际上MT5并不是MT4的升级版,各是各。(这是他们官方说的不是升级版。)MT4与MT5的系统区别1、最大的区别在于,MT5无锁仓功能,而MT4有锁仓功能2、MT4和MT5的指标脚本EA,依然兼容性很差,可以理解为2个独立的东西,只是语法上有很多类似的3、MT5增加了更多的周期,满足更多不同的需要4、历史数据加载不同:MT4采用hst,每个周期…

    2022年5月7日
    146
  • python字典和json字符串相互转化的方法_pythonjson文件存储

    python字典和json字符串相互转化的方法_pythonjson文件存储序列化与反序列化按照某种规则,把内存中的数据保存到文件中,文件是一个字节序列,所以必须要把内存数据转换成为字节序列,输出到文件,这就是序列化;反之,从文件的字节恢复到内存,就是反序列化;pytho

    2022年7月29日
    11
  • 模逆矩阵「建议收藏」

    模逆矩阵「建议收藏」整数a对同余n之乘法模逆元是指满足以下公式的整数b乘法模逆元又称为数论倒数,其实可以看作是普通倒数在模算术中的推广。同理,乘法模逆矩阵可以看作是普通逆矩阵在模算术中的推广。例如求如下矩阵K的模26的乘法逆此时,求逆矩阵的如下公式依然有效,不过,里面的符号含义要推广到模算术中:这里,ad-bc=3×5-2×3=9,的含义不再是普通的倒数,而是数论倒数所以…

    2022年5月14日
    88
  • android之两种设置全屏或者无标题的方法

    在开发中我们经常需要把我们的应用设置为全屏或者不想要title,这里是有两种方法的,一种是在代码中设置,另一种方法是在配置文件里改:一、在代码中设置:package jason.tutor; import android.app.Activity; import android.os.Bundle; import android.view.Window; imp

    2022年3月9日
    49
  • FastClick遇到的坑及解决办法

    FastClick遇到的坑及解决办法最近产品妹子提出了一个体验issue——用iOS在手Q阅读书友交流区发表书评时,光标点击总是不好定位到正确的位置:如上图,具体表现是较快点击时,光标总会跳到textarea内容的尾部。只有当点击停留时间较久一点(比如超过150ms)才能把光标正常定位到正确的位置。一开始我以为是iOS原生的交互问题没太在意,但后来发现访问某些页面又是没有这种奇怪体验的。然后怀疑是否…

    2022年6月19日
    58
  • (20211206更新)ubuntu18.04 安装Python3.8.3、jupyter notebook远程连接配置、虚拟环境搭建。及torch、tensorflow成功下载[通俗易懂]

    (20211206更新)ubuntu18.04 安装Python3.8.3、jupyter notebook远程连接配置、虚拟环境搭建。及torch、tensorflow成功下载[通俗易懂]最近搞了一个低配云服务器,就瞎整。多次踩坑后,进行记录问题之前有试过删除软链接、进行替换#删除软连接sudorm-rf/usr/bin/python3sudorm-rf/usr/bin/pip3#新建软连接sudoln-s/usr/local/python3/bin/python3.8/usr/bin/python3sudoln-s/usr/local/python3/bin/pip3.8/usr/bin/pip3但是吧,后续的pipinstall会出

    2022年6月23日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号