MYSQL 回表、索引覆盖、 索引下推[通俗易懂]

MYSQL 回表、索引覆盖、 索引下推[通俗易懂]1.索引种类创建数据表&插入数据createtableuser(idint(10)auto_increment,namevarchar(30),agetinyint(4),primarykey(id),indexidx_age(age)USINGBTREE)engine=innodbcharset=utf8mb4;insertintouser(name,age)values(‘张三’,30),

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

1. 索引种类

创建数据表& 插入数据

create table user(
    id int(10) auto_increment,
    name varchar(30),
    age tinyint(4),
    primary key (id),
    index idx_age (age) USING BTREE
)engine=innodb charset=utf8mb4;


insert into user(name,age) values
('张三',30),
('李四',20),
('王五',40),
('刘八',10);

聚簇索引

每个 INNODB 表 都会有一个聚簇索引 创建规则如下:

* 如果表设置了主键,则主键就是聚簇索引

* 如果表没有主键,则会默认第一个NOT NULL,且唯一(UNIQUE)的列作为聚簇索引

* 以上都没有,则会默认创建一个隐藏的row_id作为聚簇索引

聚簇索引整体是一个B+树,非叶子节点存放的是键值,叶子节点存放的是行数据,称之为数据页,这就决定了表中的数据也是聚簇索引中的一部分,数据页之间是通过一个双向链表来链接

数据存储结构简图:

MYSQL 回表、索引覆盖、 索引下推[通俗易懂]

普通索引

普通索引也叫二级索引,辅助索引, 除聚簇索引外的索引,即非聚簇索引。

InnoDB的普通索引叶子节点存储的是主键(聚簇索引)的值,而MyISAM的普通索引存储的是记录指针。

MYSQL 回表、索引覆盖、 索引下推[通俗易懂]

 2. 回表查询

执行下面sql查询

select id,name from user where age = 10;

分析查询过程,  首先通过普通索引(age) 定位 age = 10 的ID 然后通过聚集索引 查询select 字段返回结果集 , 此过程 需要扫描两次索引B+树,它的性能较扫一遍索引树更低。

3. 索引覆盖

执行下面sql查询

select id,age from user where age = 10;

可通过普通索引列(age) 就能获取SQL所需的所有列数据,无需回表,速度更快。

explain 分析:

MYSQL 回表、索引覆盖、 索引下推[通俗易懂]

 可通过Extra 是否是Using Index 判断查询是否索引覆盖

如何实现索引覆盖: 

将被查询的字段,建立到联合索引里去

哪些场景适合使用索引覆盖来优化SQL

  • 全表count查询优化 
  • 列查询回表优化

  • 分页查询

4. 索引下推

在上面数据表的基础上 添加复合索引 

 index idx_age_name (age,name)

执行下面sql查询,分析查询过程

select id,age from user where name like '张%' and age = 20;

Mysql版本 < 5.6

检索复合索引 idx_name_age  查询出所有 name 包含 “张” 的主键ID 然后通过聚簇索引判断出所有符合where子句的数据返回 ,此过程需要回表

Mysql版本 >= 5.6

检索复合索引 idx_name_age  查询所有 name 包含 “张” 的 且age =20 的数据 直接返回结果集, 无需回表

可见 索引下推在非主键索引上的优化,可以有效减少回表的次数,大大提升了查询的效率

explain 分析:

MYSQL 回表、索引覆盖、 索引下推[通俗易懂]

 Using Index Condition  使用了索引下推的表现

end!

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 编程题:分苹果_同学分苹果的小学题

    编程题:分苹果_同学分苹果的小学题题目描述n只奶牛坐在一排,每个奶牛拥有ai 个苹果,现在你要在它们之间转移苹果,使得最后所有奶牛拥有的苹果数都相同,每一次,你只能从一只奶牛身上拿走恰好两个苹果到另一个奶牛上,问最少需要移动多少次可以平分苹果,如果方案不存在输出-1。输入描述:每个输入包含一个测试用例。每个测试用例的第一行包含一个整数n(1&lt;=n&lt;=100),接下来的一行包含n个整数ai(1&l…

    2022年10月12日
    3
  • Fiddler+夜神模拟器进行APP抓包

    Fiddler+夜神模拟器进行APP抓包Fiddler+夜神模拟器进行APP抓包作者:霞落满天需求:对公司APP进行抓包获取详细的接口信息,这是现在开发必备的。工具:Fiddler抓包,夜神模拟器模拟手机安装APP1.下载Fiddlerhttps://www.telerik.com/download/fiddlerFiddler正是在这里帮助您记录计算机和Internet之间传递的所有HTTP和HTTPS通信…

    2022年5月7日
    104
  • 查看服务器外网ip

    查看服务器外网ip如果是桌面系统,想知道自己电脑的外网IP比较容易,用浏览器访问www.ip138.com,就可以了。而服务器放在机房,没有浏览器这号东西,就比较麻烦了。用traceroute又看不出来。偶然间,找到了一个方法可以查看服务器的外网IP。[javascript] viewplaincopy[zhou@localhost ~]$ wget htt

    2022年6月2日
    28
  • 随机数生成算法

    随机数生成算法转自:https://www.cnblogs.com/ECJTUACM-873284962/p/6926203.html1、蒙特卡洛法  蒙特卡罗方法又称统计模拟法、随机抽样技术,是一种随机模拟方法,以概率和统计理论方法为基础的一种计算方法,是使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。将所求解的问题同一定的概率模型相联系,用电子计算机实现统计模拟或抽样,以获得问题的近似…

    2022年7月26日
    6
  • 阿里云短信平台实现手机验证码登录_在线云短信验证码

    阿里云短信平台实现手机验证码登录_在线云短信验证码阿里云短信平台实现手机验证码登录首先创建一个工具类工具类AliyunMessageUtil代码如下所示:publicclassAliyunMessageUtil{ privatestaticfinalStringproduct=”Dysmsapi”; //产品域名,开发者无需替换 privatestaticfinalStringdomain=”dysmsapi.aliyuncs.com”; //此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)TOD

    2025年7月12日
    2
  • 一个普通Android程序员的2018总结2019计划

    一个普通Android程序员的2018总结2019计划承接去年总结:一个普通Android程序员的20182018:总结这一年继续分三个方面吧:职场篇:这一年发生了很多事,上家公司团队经营问题,最终结果是团队解散,期间发生一系列事情,参照一个普通一个Android程序员的心酸历程(2018.5.1)。然后修整两个月,找到了现在这家公司,公司目前规模不大,但各方面管理和上家公司天壤之别,至少目前我工作过的公司里面,算是最好的了,工资不是很高,…

    2022年6月14日
    40

发表回复

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

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