mysql 创建覆盖索引_MySql覆盖索引

mysql 创建覆盖索引_MySql覆盖索引mysql 的 innodb 引擎通过搜索树方式实现索引 索引类型分为主键索引和二级索引 非主键索引 主键索引树中 叶子结点保存着主键即对应行的全部数据 而二级索引树中 叶子结点保存着索引值和主键值 当使用二级索引进行查询时 需要进行回表操作 1 覆盖索引 CREATETABLE user table id int 11 unsignedNOTN INCREMENT

mysql的innodb引擎通过搜索树方式实现索引,索引类型分为主键索引和二级索引(非主键索引),主键索引树中,叶子结点保存着主键即对应行的全部数据;而二级索引树中,叶子结点保存着索引值和主键值,当使用二级索引进行查询时,需要进行回表操作。

1.覆盖索引

CREATE TABLE `user_table` (

`id` int(11) unsigned NOT NULL AUTO_INCREMENT,

`username` varchar(255) NOT NULL,

`password` varchar(255) DEFAULT NULL,

`age` int(11) unsigned Not NULL,

PRIMARY KEY (`id`),

key (`username`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

语句A

select id from user_table where username = ‘xxx’

执行该语句, 因为username索引上包含主键值所以直接返回

语句B

select password form user_table where username = ‘xxx’

执行该语句,查询到username索引上的主键值, 然后再根据主键值回表查询出password。

由上可知当select的列和where的列都在索引上的时候就不需要进行回表操作。

所以我们可以新建username和password的联合索引增加查询效率。

2.联合索引

通俗理解:

利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引 不同于使用两个单独的索引。复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。如果您知道姓,电话簿将非常有用;如果您知道姓和名,电话簿则更为有用,但如果您只知道名不姓,电话簿将没有用处。

所以说创建复合索引时,应该仔细考虑列的顺序。对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用;仅对后面的任意列执行搜索时,复合索引则没有用处。

最左前缀原则

以最左边的为起点任何连续的索引都能匹配上

联合索引本质:

当创建(a,b,c)联合索引时,相当于创建了(a)单列索引,(a,b)联合索引以及(a,b,c)联合索引

想要索引生效的话,只能使用 a和a,b和a,b,c三种组合;当然,我们上面测试过,a,c组合也可以,但实际上只用到了a的索引,c并没有用到!

2.索引下推

现有联合索引(username, age)

语句C

select * from user_table where username like ‘张%’ and age > 10

我们判断有两种情况

先在索引中查询出以张开头的索引然后进行回表操作过滤出年龄大于10的数据

直接所以中查询出以张开头的和年龄大于10的索引在进行回表操作

很明显第二种回表的数据更小,这就是索引下推

注意点

1.innodb引擎的表,索引下推只能用于二级索引。就像之前提到的,innodb的主键索引树叶子结点上保存的是全行数据,所以这个时候索引下推并不会起到减少查询全行数据。

2.索引下推一般可用于所求查询字段(select列)不是/不全是联合索引的字段,查询条件为多条件查询且查询条件子句(where/order by)字段全是联合索引。

假设表t有联合索引(a,b),下面语句可以使用索引下推提高效率

select * from t where a > 2 and b > 10;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
上一篇 2026年3月26日 下午7:23
下一篇 2026年3月26日 下午7:23


相关推荐

  • qt运行cmd命令_cmd ping大包命令

    qt运行cmd命令_cmd ping大包命令0-问题描述在实现QT调用外部程序cmd.exe的时候传回来的参数需要显示在textbrowser控件上,但是一直等待数据全部接受完毕会才显示,会导致页面卡死的假象,所以下面利用append()进行每次都更新,可以很好的解决这个问题。1-解决方案//mainwindow.cpp文件,主界面实现#include”mainwindow.h”#include”ui_mainwindow.h…

    2025年11月25日
    5
  • ICMP报文格式解析

    ICMP报文格式解析ICMP报文的格式类型总共分为三大类:1、差错报文2、控制报文3、查询报文上图是ICMP报文的基本格式,上面提到的三种ICMP报文均有“类型,代码和校验和”三个字段,后面还有4个字节是根据不同的报文类型而有不同的格式,有的是全0,有的则有其他的特殊格式。但是ICMP始终有8个字节的头部长度。其中类型字段代表着不同的报文类型,而代码字段指明了某个类型的报文中细分出的该报文的指定的功能。即一个类型的报文拥有着多种功能。同时还需要注意的是ICMP差错报文的数据部分存储的是IP头部和IP头.

    2022年5月5日
    96
  • “龙虾”卸载指南,来了!

    “龙虾”卸载指南,来了!

    2026年3月13日
    1
  • 手动更新PIP(手机怎么手动更新)

    有时候使用命令行无法更新PIP,此时需要手动进行更新。可以参考:https://blog.csdn.net/lyj_viviani/article/details/70568434

    2022年4月11日
    39
  • 台式计算机和便携式计算机是替代品吗,iPad能否替代笔记本电脑?这结果我一万个不服!…「建议收藏」

    近年来,随着平板电脑的不断发展,有一个长期存在的问题,平板(文中主要指iPad)是否可以替代传统笔记本电脑?平板电脑和笔记本电脑如今可以做很多事情,最好的平板电脑甚至比一些笔记本电脑功能更强大,但它是一个平板电脑真的是传统的便携式计算机合适的替代品吗?我们看一下这两种平台的设备都可以提供什么,以及哪种平台最适合您的需求!笔记本电脑与平板电脑:便携性!首先,是便携性问题。虽然两种类型的设备都可以随身…

    2022年4月11日
    66
  • Java神操作之SpringBoot基础上添加Kotlin混合开发

    Java神操作之SpringBoot基础上添加Kotlin混合开发第一步在原有基础上引入依赖 dependency groupId org jetbrains kotlin groupId artifactId kotlin stdlib jre8 artifactId dependency

    2026年3月18日
    4

发表回复

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

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