Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >如何让mysql索引更快一点

如何让mysql索引更快一点

作者头像
谭小谭
发布于 2019-06-03 07:09:52
发布于 2019-06-03 07:09:52
81700
代码可运行
举报
文章被收录于专栏:谭小谭谭小谭
运行总次数:0
代码可运行

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

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

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 的优化器机制,这里暂且不说了,以后再写。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1    bob 16  1
2    kom 19  0
3    gum 18  1
4    tt  20  1
5    yy  25  1

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 字段也添加到索引中来。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#删除原索引
drop INDEX age on USER
#新建覆盖索引
ALTER TABLE USER add index age_name(age,name)

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

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

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

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

有问题欢迎大家留言交流,原创不易,如果文章对你有帮助,欢迎点在看,感谢支持。

推荐文章:

mysql为什么加索引就能快

mysql索引为啥要选择B+树 (下)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 谭小谭 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
mysql为什么加索引就能快
平时我们要优化 mysql 查询效率的时候,最常见的就是给表加上合适的索引了,那今天就来聊聊为什么加了索引就快了呢。
谭小谭
2019/06/03
2K0
你必须懂的一些MySQL索引技巧
为了更好地进行解释,我创建了一个存储引擎为InnoDB的表user_innodb,并批量初始化了500W+条数据。包含主键id、姓名字段(name)、性别字段(gender,用0,1表示不同性别)、手机号字段(phone),并为name和phone字段创建了联合索引。
蝉沐风
2022/08/11
6080
你必须懂的一些MySQL索引技巧
MySQL索引(深入浅出)
索引的作用就是为了加快搜索,计算机要处理的数据非常复杂,为了快速检索多种多样的数据,聪明的程序员们就发明了各种类型的索引。
一行舟
2022/08/25
4320
MySQL索引(深入浅出)
1.5万字+30张图盘点索引常见的11个知识点
本来这篇文章我前两个星期就打算写了,提纲都列好了,但是后面我去追《漫长的季节》这部剧去了,这就花了一个周末的时间,再加上后面一些其它的事,导致没来得及写
三友的java日记
2023/08/18
2160
1.5万字+30张图盘点索引常见的11个知识点
mysql索引
这里是为后续的mysql调优做准备,要像做到mysql调优,索引很关键,理解索引结构,页结构,对于调优来说是很重要的基础。
Joseph_青椒
2023/08/02
2740
mysql索引
【图文动画详解原理系列】1.MySQL 索引原理详解
MySQL是一个开放源代码的关系数据库管理系统。原开发者为瑞典的MySQL AB公司,最早是在2001年MySQL3.23进入到管理员的视野并在之后获得广泛的应用。 2008年MySQL公司被Sun公司收购并发布了首个收购之后的版本MySQL5.1,该版本引入分区、基于行复制以及plugin API。移除了原有的BerkeyDB引擎,同时,Oracle收购InnoDB Oy发布了InnoDB plugin,这后来发展成为著名的InnoDB引擎。2010年Oracle收购Sun公司,这也使得MySQL归入Oracle门下,之后Oracle发布了收购以后的首个版本5.5,该版本主要改善集中在性能、扩展性、复制、分区以及对windows的支持。目前版本已发展到5.7。
一个会写诗的程序员
2021/03/04
2.5K1
MySQL原理简介—9.MySQL索引原理
数据库所有的数据都会存放到磁盘上的文件,数据在文件里存放的物理格式就是数据页,大量的数据页会按顺序一页一页存放的,两两相邻的数据页之间会采用双向链表的格式互相引用。
东阳马生架构
2025/02/09
940
Mysql索引简明教程
既然我们已经建立了B+树,那么就要好好利用它来加速查询,而不是傻傻的去遍历整张表。
Java3y
2019/11/21
5550
MySQL索引分类,90%的开发都不知道
MySQL的索引分类问题一直让人头疼,几乎所有的资料都会给你列一个长长的清单,给你介绍什么主键索引、单值索引,覆盖索引,自适应哈希索引,全文索引,聚簇索引,非聚簇索引等……给人的感觉就是云里雾里,好像MySQL索引的实现方式有很多种,但是都没有一个清晰的分类。所以本人尝试总结了一下如何给MySQL的索引类型分类,便于大家记忆,由于MySQL中支持多种存储引擎,在不同的存储引擎中实现略微有所差距,下文中如果没有特殊声明,默认指的都是InnoDB存储引擎。
腾讯云数据库 TencentDB
2020/03/24
1.8K0
数据库索引,你要了解的都在这里!
数据库索引好比是一本书前面的目录,能加快数据库的查询速度。索引是对数据库表中一个或多个列(例如,User 表的 '姓名' 列)的值进行排序的结构。如果想按特定用户的姓名来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。
JAVA日知录
2020/05/09
6090
和面试官聊了半小时的MySQL索引!
你好,我是田哥。这篇文章是因为一位朋友前天出去面试了,然后面试上来就一顿MySQL所以追问,幸好她和我有深入的探讨MySQL索引,熬过此劫,也成功进入二面,同时也希望本文对你有所帮助。
田维常
2022/06/13
5830
和面试官聊了半小时的MySQL索引!
MySQL索引原理
MySQL索引原理 MySQL 的索引 概述 索引是数据库中一个排序的数据结构,用来协助快速查询和更新数据库表中的数据;数据是以文件的形式存放在磁盘上的,每一行数据都有它的磁盘地址;当没有索引时,比如从 **500w** 条数据中检索出一条数据,只能依次遍历这张表的全部数据,直到找到这条数据。但是有了索引后,只需要在索引里去检索这条数据就可以了,因为它是一种专门进行数据检索特殊的数据结构,在找到数据存放的磁盘地址后就可以拿到数据。在 **InnoDB** 存储引擎中,索引有三类: 普通(**norm
编程之心
2021/07/14
4550
MySQL索引原理
MySQL索引详解及演进过程以及延申出面试题(别再死记硬背了,跟着我推演一遍吧)
  索引在关系型数据库中,是一种单独的、物理的对数据库表中的一列或者多列值进行排序的一种存储结构,它是某个表中一列或者若干列值的集合,还有指向表中物理标识这些值的数据页的逻辑指针清单。   索引的作用相当于图书的目录,可以根据目录重点页码快速找到所需要的内容,数据库使用索引以找到特定值,然后顺着指针找到包含该值的行,这样可以是对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。
向着百万年薪努力的小赵
2022/12/02
7360
MySQL索引详解及演进过程以及延申出面试题(别再死记硬背了,跟着我推演一遍吧)
MYSQL 回表、索引覆盖、 索引下推[通俗易懂]
* 如果表没有主键,则会默认第一个NOT NULL,且唯一(UNIQUE)的列作为聚簇索引
全栈程序员站长
2022/11/10
2.1K0
MYSQL 回表、索引覆盖、 索引下推[通俗易懂]
分页场景慢?MySQL的锅!
在刚工作的时候,发现分页场景下,当offset变大,MySQL处理速度非常慢!具体sql如下:
小林coding
2021/05/27
7600
分页场景慢?MySQL的锅!
Mysql索引原理及应用场景
在工作当中,涉及到Mysql的查询,我们经常会遇到给某个表某个字段加索引的诉求,加上索引能够让我们的sql得到查询速度上的提升。但索引的原理是什么呢,他又是怎么工作的,需要开发者对基础知识有一定的了解。
benym
2022/08/30
1.3K0
Mysql索引原理及应用场景
面试系列-innodb聚簇索引及非聚簇索引
聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。这个特性决定了索引组织表中数据也是索引的一部分,每张表只能拥有一个聚簇索引。
用户4283147
2022/10/27
7920
面试系列-innodb聚簇索引及非聚簇索引
大白话mysql之深入浅出索引原理 - 下
在之前大白话mysql之深入浅出索引原理 - 上这篇文章中提到过,mysql 的 innodb 引擎通过搜索树方式实现索引,索引类型分为主键索引和二级索引(非主键索引),主键索引树中,叶子结点保存着主键即对应行的全部数据;而二级索引树中,叶子结点保存着索引值和主键值,当使用二级索引进行查询时,需要进行回表操作。假如我们现在有如下表结构。
会玩code
2022/04/24
3580
大白话mysql之深入浅出索引原理 - 下
第16期:索引设计(MySQL 的索引结构)
上一章(第15期:索引设计(索引组织方式 B+ 树))讲了数据库基本上都用 B+ 树来存储索引的原因:适合磁盘存储,能够充分利用多叉平衡树的特性,磁盘预读,并且很好的支持等值,范围,顺序扫描等。这篇主要介绍 MySQL 两种常用引擎,MyISAM 和 InnoDB 的索引组织方式,了解这些存储方式,对数据库优化很有帮助。
爱可生开源社区
2020/11/19
8720
第16期:索引设计(MySQL 的索引结构)
MySQL索引
索引需要保存到磁盘上,假设我们使用平衡二叉树来存储,一个100万个节点的二叉树高20,一次查询需要访问20个数据块,机械硬盘随机读取一个数据块大约需要10ms时间,因此单独访问一个行大约需要200ms时间。
shysh95
2022/02/16
4K0
MySQL索引
相关推荐
mysql为什么加索引就能快
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验