如何让mysql索引更快一点

后端开发,公众号内容包括但不限于 python、mysql、数据结构和算法、网络协议、Linux。技术人怎能只有技术和代码,如果你对投资理财、保险,英语学习、读书写作有兴趣,都欢迎来公众号【谭某人】与我交流,你总会有些收获。

在 InnoDB 中,从二级索引回到主键索引查询数据,这个过程称作回表过程,而且这个回表过程是可以被优化的,这个优化就是利用覆盖索引

先说结论,如果一个索引的字段包含了所有要查询的字段,这个索引就称作覆盖索引,覆盖索引可以减少回表过程,能有效提高查询效率

前面我们有说过,在 InnoDB 中数据都是保存在 B+ 树上,主键索引保存了整行记录,二级索引保存了主键的值。

一次查询操作,要么是遍历主键索引,要么是遍历二级索引,要么就是先遍历二级索引得到主键 id 的值,然后再到主键索引上通过主键 id 查找满足要求的记录。

如果只遍历一次 B+ 树就能获取到我们要的数据,即没有回表过程,这个效率显然是不错的,这就是覆盖索引的优势。下面看个具体的例子。

mysql> create table user(
id int(11) primary key, 
name varchar(20) not null, 
age int(11),
sex int(11),
index (age)) engine=InnoDB;

依然是新建一个表,创建索引,插入一些测试数据,注意这里只是为了解释说明覆盖索引,并不表示 mysql 的真实执行方式,因为会涉及到 mysql 的优化器机制,这里暂且不说了,以后再写。

1    bob 16  1
2    kom 19  0
3    gum 18  1
4    tt  20  1
5    yy  25  1

创建一个 user 表,给 age 字段添加一个二级索引,并插入上面五条数据,然后看下面这条查询语句。

select name from user where age between 18 and 21

我们来分析下这条 sql 的执行过程:

1、age 字段上有索引,mysql 会先到 age 字段的 B+ 树上找到满足条件的第一个叶子节点(age=19),这个叶子节点上保存了对应主键 id 的值 2,然后再到主键索引上找到 id 为 2 的这条记录,同时把 name 字段拿出来。

2、重复第一步的操作,继续从 age 索引上的叶子节点往后遍历找出满足条件的第二个叶子节点,同样回到主键上拿出 name 字段的值,直到遍历到不满足条件的叶子节点(age=25)。

也就是说,这条 sql 语句虽然用到了索引,但是 age 索引上并没有要查询的 name 字段,所以只能回表到主键索引上查出 name 字段,所以这个过程其实是遍历了个两个 B+ 树。

那么我们删除 age 这个单列索引,创建一个覆盖索引 (age,name), 把要查询的 name 字段也添加到索引中来。

#删除原索引
drop INDEX age on USER
#新建覆盖索引
ALTER TABLE USER add index age_name(age,name)

由于现在这个覆盖索引上的字段包含了要查询的 age 和 name 字段,免去了到主键索引上查询数据的过程,其实也就是只遍历了一个 B+ 树,可以大大提升查询效率。

添加索引虽然能提升查询效率,但索引也是需要占用额外空间的,而且索引还需要维护成本,所以通常加不加索引需要根据实际需求来权衡。

总之,在设计索引或者优化 sql 语句的时候,要尽量避免回表操作,所以使用覆盖索引是一种常用的 sql 优化手段。

所以我们平时写 sql 语句的时候,select 后面只写查询需要用到的字段,去掉不需要的字段,避免回表操作。

【End】

听说你对现在的工作不是特别满意?别担心,老王给你准备一份「Java最常见200+面试题全解析」,助力大家找到更好的工作,这份面试题包含的模块:

  • Java、JVM 最常见面试题解析

  • Spring、Spring MVC、MyBatis、Hibernate 面试题解析

  • MySQL、Redis 面试题解析

  • RabbitMQ、Kafka、Zookeeper 面试解析

  • 微服务 Spring Boot、Spring Cloud 面试解析

扫描下面二维码付费阅读

关注下方二维码,订阅更多精彩内容。

转发朋友圈,是对我最大的支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/546641.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

将本地项目上传到码云(gitee)远程仓库

前提条件: 1、本地电脑上已经安装了 git客户端,未安装的,具体安装过程可以参考此安装链接:https://blog.csdn.net/ezreal_tao/article/details/81609883 2、用户已经在gitee码云上注册完成 具体操作步骤: 1、登录码云…

单线程的Redis为什么却能支撑高并发?

作者:Draveness原文链接:draveness.me/redis-io-multiplexing最近在看 UNIX 网络编程并研究了一下 Redis 的实现,感觉 Redis 的源代码十分适合阅读和分析,其中 I/O 多路复用(mutiplexing)部分的实现非常干净…

在Windows10上安装WSL使用binwalk命令

Windows 10 推出的WSL 功能可以协助我们直接使用binwalk 分析Windows 内的文件 一、WSL 准备 1、打开控制面板→应用→程序和功能→启动或关闭Windows 功能,打开“适用于Linux 的Windows 子系统”和“虚拟机平台”,随后需要重启。 2、打开Windows 10 自…

最详细的 IDEA调试教程

Debug用来追踪代码的运行流程,通常在程序运行过程中出现异常,启用Debug模式可以分析定位异常发生的位置,以及在运行过程中参数的变化。通常我们也可以启用Debug模式来跟踪代码的运行流程去学习三方框架的源码。在Intellij IDEA中使用好Debug&…

centos 修改ip地址

为什么80%的码农都做不了架构师?>>> 查看IP地址 1 登陆连接centos系统,输入 ifconfig 可以查看到当前本机的IP地址信息,如下图 临时设置IP地址 1 如本机为例,上面查询IP为1.117,输入 ifconfig eth0 &…

经典面试题:如何保证缓存与数据库的双写一致性?

作者:你是我的海啸地址:http://t.cn/EK64FeP只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题?面试题剖析一般来说&#x…

四、华为鸿蒙HarmonyOS应用开发之Java开发下Page Ability生命周期

系统管理或用户操作等行为均会引起Page实例在其生命周期的不同状态之间进行转换。Ability类提供的回调机制能够让Page及时感知外界变化,从而正确地应对状态变化(比如释放资源),这有助于提升应用的性能和稳健性。 Page生命周期回调 Page生命周期的不同状态转换及其对应的回…

jQuery.grep()

作用:grep()方法用于数组元素过滤筛选。语法:grep(array,callback,invert)。参数含义:array:带过滤数组。callback:数组过滤函数,该函数包含两个参数,第一个是当前数组元素的值 ,第二…

写简历的十大误区

作者:Coody地址:my.oschina.net/hooker/blog/3014656在互联网极速膨胀的社会背景下,各行各业涌入互联网的IT民工日益增大。早在2016年,我司发布了Java、Ios工程师的招聘信息,就Java工程师单个岗位而言,日收…

五、华为鸿蒙HarmonyOS应用开发之Java开发模式下的同一个 Page 里实现页面跳转时无参(有参)传递、回值详解

同一Page内导航 当发起导航的AbilitySlice和导航目标的AbilitySlice处于同一个Page时,您可以通过present()方法实现导航。如下代码片段展示通过点击按钮导航到其他AbilitySlice的方法: @Override protected void onStart(Intent intent) {...Button button = ...;button.<…

centos6.5安装mongodb2.6

下载地址&#xff1a;http://www.mongodb.org/downloads 解压命令&#xff1a;tar zxf mongodb-linux-i686-2.6.0.tgz 存放目录&#xff1a;/usr/local/mongodb 数据目录&#xff1a;/mongodb/data/ 日志文件&#xff1a;/mongodb/dblogs 没有具体的安装步骤&#xff0c;解压到…

<math.h> 头文件:C语言数学库函数

文章目录 概述基本算术运算sqrt()fabs()pow() 三角函数sin()cos() 对数函数log()log10() 指数函数exp() 其他函数ceil()floor() 结语 概述 math.h 是C语言标准库中的头文件&#xff0c;提供了许多与数学运算相关的函数。在本文中&#xff0c;我们将深入讨论一些 math.h 中常用…

面试官问你MySQL的优化,看这篇文章就够了

作者&#xff1a;zhangqhsegmentfault.com/a/1190000012155267一、EXPLAIN做MySQL优化&#xff0c;我们要善用 EXPLAIN 查看SQL执行计划。下面来个简单的示例&#xff0c;标注(1,2,3,4,5)我们要重点关注的数据type列&#xff0c;连接类型。一个好的sql语句至少要达到range级别。…

六、华为鸿蒙HarmonyOS应用开发之Java开发模式下的不同Page 间实现页面跳转

不同Page 间导航&#xff0c;实现页面跳转 AbilitySlice作为Page的内部单元&#xff0c;以Action的形式对外暴露&#xff0c;因此可以通过配置Intent的Action导航到目标AbilitySlice。Page间的导航可以使用startAbility()或startAbilityForResult()方法&#xff0c;获得返回结…

Android 网络编程

&#xff0c;在JAVA中进行网络通信&#xff0c;我们需要定义一个HttpPost对象&#xff0c;此对象需要输入url参数。然后定义一个List<NameValuePair>对象来以JSON的形式存储数据。接着通过HttpPost的getParams().setParameter()方法进行一些必要参数的设置&#xff0c;例…

不得不说--自动化测试元素定位与用例设计

关于自动化测试&#xff0c;经常被问到元素的定位 与 如何设计用例。 很多时间我也帮不了你解决实际的问题&#xff0c;只能从个人脚本谈谈如何看待这些问题。 不得不说之元素定位 虽然&#xff0c;本章写了十几篇文章来讲元素的定位与操作&#xff0c;对于碰到的一些常见功能&…

七、华为鸿蒙HarmonyOS应用开发之Java UI框架、常用Text组件和Button组件使用

一、Java UI框架概述 应用的Ability在屏幕上将显示一个用户界面,该界面用来显示所有可被用户查看和交互的内容。 应用中所有的用户界面元素都是由Component和ComponentContainer对象构成。Component是绘制在屏幕上的一个对象,用户能与之交互。ComponentContainer是一个用于…

MySQL 快速创建千万级测试数据

作者&#xff1a;IKNOW本尊链接&#xff1a;http://t.cn/E96Shud背景在进行查询操作的性能测试或者 sql 优化时&#xff0c;我们经常需要在线下环境构建大量的基础数据供我们测试&#xff0c;模拟线上的真实环境。总不能让我去线上去测试吧&#xff0c;会被DBA砍死的创建测试数…

【面试收藏】Redis最全面试题

出自&#xff1a;https://github.com/CyC2018/CS-Notes程序员乔戈里整理一、概述二、数据类型STRINGLISTSETHASHZSET三、数据结构字典跳跃表四、使用场景计数器缓存查找表消息队列会话缓存分布式锁实现其它五、Redis 与 Memcached数据类型数据持久化分布式内存管理机制六、键的…

ALLEN-XIE

ALLEN-XIEABOUTAllen Xie是一家坚持理念至上的西装定制店。我们的价值观渗透于我们所做的每一件事中&#xff0c;从而确保始终遵循自己的风格。我们坚持用最高标准要求自己&#xff0c;因此&#xff0c;在制衣过程中&#xff0c;两次的试衣过程以确保每一件西装都可以完美的贴合…