MySQL调优系列(五)——索引详解

news2024/12/30 2:55:54

一、索引的定义

数据库索引就像是书前面的目录,能加快数据库的查询速度。
索引是一种数据结构,用于帮助我们在大量数据中快速定位到我们想要查找的数据。
是一种帮助MySQL高效获取数据的数据结构
ps:大多数情况下,索引查询都是比全表扫描要快的。但是如果数据库的数据量不大,那么使用索引也不一定能够带来很大提升。

我们看一下之前一篇文章:MySQL调优系列(四)——执行计划。
里面有两段这个描述:
在这里插入图片描述
这个地方要特别注意,因为执行计划可以看到我们的索引的使用。

二、索引的优缺点

优点:
1、加大检索速度(减少索引数据量),从数据结构是B+树就能看出。
2、避免排序(order by,索引已经排好序了)、临时表(查询出来的临时存储的表)
3、将随机 IO 变成顺序 IO
4、创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
缺点:
1、创建索引和维护索引需要耗费许多时间。当对表中的数据进行增删改的时候,如果数据有索引,那么索引也需要动态的修改,会降低 SQL 执行效率
2、索引需要使用物理文件存储,也会耗费一定空间。

三、索引的分类

看分类之前,先把索引的数据结构列一下,详情参考:数据结构之“树”——二叉树、红黑树、B树、B+树、B*树。
在这里插入图片描述
mysql有三个存储引擎,Innodb和Myisam的数据结构都是B+树(有区别,下面讲),Memory的数据结构是hash表,关于hash表,可参考:HashMap源码解析(jdk1.8,万字大章,图文并茂)。
索引从不同维度,有不同的分类:
一般按应用维度区分:
1、主键索引:顾名思义,是主键来做索引,数据库会默认给主键列添加索引。
2、唯一索引:唯一列添加的索引。
3、普通索引:不是主键,也不是唯一列,又称二级索引或者辅助索引。
4、组合索引:在某些情况下需要给多个列添加一个索引,此时就组成了组合索引。
5、全文索引:对文本的内容进行分词,进行搜索。目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。一般不会使用,效率较低,通常使用搜索引擎如 es代替。
6、覆盖索引:一个索引包含(或者说覆盖)所有需要查询的字段的值。
按底层存储引擎的存储方式分:
1、聚簇索引(聚集索引):索引结构和数据一起存放的索引,InnoDB 中的主键索引就属于聚簇索引。
2、非聚簇索引(非聚集索引):索引结构和数据分开存放的索引,二级索引(辅助索引)就属于非聚簇索引。MySQL 的 MyISAM 引擎,不管主键还是非主键,使用的都是非聚簇索引。
这里先不急详解,我们先看索引的最佳的匹配方式。

四、索引匹配方式–组合索引-最左匹配

先建表,如图:
在这里插入图片描述

创建组合索引,尽量选择长度比较小的列,占用空间较小。

ALTER table suoyin_test add INDEX zuhe(name,area,qq);

在这里插入图片描述

1、全值匹配

全值匹配指的是和索引中的所有列进行匹配。尽可能多使用索引的列。

explain select * from suoyin_test where name = '1' and area = '23' and qq = 'dev';

在这里插入图片描述
从图中可以看到:
(1)type为ref:使用了非唯一性索引进行数据的查找。
(2)possible_keys和key为zuhe,是当前使用的索引。
(3)ref是const,const,const,表示索引的三列都被使用了,且索引查找的是一个常量值。

2、匹配最左前缀

只匹配前面的几列。

explain select * from suoyin_test where name = '1' and area = '23';

在这里插入图片描述

3、匹配列前缀

匹配某一列的开头部分,类似于模糊查询。

explain select * from suoyin_test where name = '1';
explain select * from suoyin_test where name  like 'A%';
explain select * from suoyin_test where name  like '%A%';

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从上面可以看到,type在一步步的效率从好到坏。
匹配列前缀可以达到range,避免了index的全索引扫描,但是若是模糊匹配前缀,会导致达到all级别,进行全表扫描,且索引压根没用到。
所以,有个优化小tips,查询语句尽量不要模糊匹配前缀。

4、匹配某个范围值

explain select * from suoyin_test where name > '1';

在这里插入图片描述

5、精确匹配某一列并范围匹配另外一列

查询第一列的全部和第二列的部分。

explain select * from suoyin_test where name = '1' and area > '23';

在这里插入图片描述

6、按索引顺序匹配–最左匹配详解

必须要先匹配到第一个列之后才能匹配第二个列,无法直接匹配第二个列的值。
就是必须按name、area、qq这种顺序去执行索引查询,比如:

explain select * from suoyin_test where name = '1' and qq > '23';

结果是:
在这里插入图片描述
它只用了name最左匹配,并没有用到qq。
但是,如果三者都有,可以不管顺序,mysql会自动匹配顺序。

explain select * from suoyin_test where  qq = 11  and area = '23' and name = '1' ;

在这里插入图片描述

explain select * from suoyin_test where  qq = 11  and area = '23';

在这里插入图片描述

在使用组合索引时,MySQL 会根据联合索引中的字段顺序,从左到右依次到查询条件中去匹配,如果查询条件中存在与组合索引中最左侧字段相匹配的字段,则就会使用该字段过滤一批数据,直至组合索引中全部字段匹配完成,或者在执行过程中遇到范围查询(如 >、<)才会停止匹配。对于 >=、<=、BETWEEN、like 前缀匹配的范围查询,并不会停止匹配。所以,我们在使用组合索引时,可以将区分度高的字段放在最左边,这也可以过滤更多数据。

7、 只访问索引的查询

查询的时候只需要访问索引,不需要访问数据行,其实就是覆盖索引。

explain select name,area,qq from suoyin_test where name = '1' and area = '23' and qq = 'dev';

五、典型索引详解

1、聚簇索引和非聚簇索引

聚簇索引和非聚簇索引都是B+树的一种,只是存储的数据不同,B+树是有序的。

(1)聚簇索引

聚簇索引即索引结构和数据一起存放的索引,并不是一种单独的索引类型。InnoDB 中的主键索引就属于聚簇索引。
数据结构如图:
在这里插入图片描述
优缺点:查询速度极快,更新代价大。
如果对索引列的数据被修改时,那么对应的索引也将会被修改,而且聚簇索引的叶子节点还存放着数据,修改代价肯定是较大的,所以对于主键索引来说,主键一般都是不可被修改的。

(2)非聚簇索引

非聚簇索引即索引结构和数据分开存放的索引,并不是一种单独的索引类型。二级索引(辅助索引)就属于非聚簇索引。MySQL 的 MyISAM 引擎,不管主键还是非主键,使用的都是非聚簇索引。
非聚簇索引的叶子节点并不一定存放数据的指针,因为二级索引的叶子节点就存放的是主键,根据主键再回表查数据。

组合索引如下:
在这里插入图片描述
优缺点:查询速度较慢(可能触发回表),更新代价小。

(3)回表

回表就是先通过数据库索引扫描出数据所在的行,再通过行主键 id 取出索引中未提供的数据,即基于非主键索引的查询需要多扫描一棵索引树(主键索引树)。
但是,有一种情况不会触发回表,那就是覆盖索引。

2、覆盖索引

如果一个索引包含(或者说覆盖)所有需要查询的字段的值,我们就称之为覆盖索引。这里可以看出,不需要去多扫描另一颗索引树了。

explain select name,area,qq from suoyin_test where name = '1' and area = '23' and qq = 'dev';

在这里插入图片描述

3、索引下推

在非聚簇索引遍历过程中,对索引中包含的字段先做判断,过滤掉不符合条件的记录,减少回表次数。这么说太笼统,我们从数据库的架构体系开始说。
首先,从MySQL调优系列(一)——性能监控可以知道,数据库架构是客户端—server层—存储引擎层,索引下推的意思,就是:
索引下推表示的是数据筛选的过程下移到存储引擎层来完成,而不是在 server层完成。
举个栗子:

explain select * from suoyin_test where name = '1' and area = '23';

未索引下推:
1、从存储引擎层拿到符合name的结果加载到 server 端;
2、在 server 端对 area字段进行条件筛选。
索引下推:
1、根据 name 和 age 的结果直接从存储引擎中返回所有符合条件的结果,无需在 server 端做任何的数据筛选工作。
使用索引下推是能够提升整体查询的效率的,mysql 5.7 版本之后是默认支持的,无需做任何设置。

六、索引优化细节

1、尽量不要使用表达式

我们先给qq加一个索引,然后查询:

explain select * from suoyin_test where  qq  = 23;

在这里插入图片描述

explain select * from suoyin_test where  qq+1 = 23;

在这里插入图片描述
可以看出,type为all,查询效率降低。
2、尽量使用主键查询,可减少回表
3、可以使用前缀索引

有时候需要索引很长的字符串,这会让索引变的大且慢,通常情况下可以使用某个列开始的部分字符串,这样大大的节约索引空间,从而提高索引效率,但这会降低索引的选择性,索引的选择性是指不重复的索引值和数据表记录总数的比值,范围从1/#T到1之间。索引的选择性越高则查询效率越高,因为选择性更高的索引可以让mysql在查找的时候过滤掉更多的行。
​ 一般情况下某个列前缀的选择性也是足够高的,足以满足查询的性能,但是对应BLOB,TEXT,VARCHAR类型的列,必须要使用前缀索引,因为mysql不允许索引这些列的完整长度,使用该方法的诀窍在于要选择足够长的前缀以保证较高的选择性,通过又不能太长。

4、使用索引扫描来做排序
创建组合索引的时候默认的索引排序是升序,所以后续用组合索引列进行排序要全部升序或者全部降序才会用到索引。
如果explain出来的type列的值为index,则说明mysql使用了索引扫描来做排序。
extra:using filesort:说明mysql无法利用索引进行排序,只能利用排序算法进行排序,会消耗额外的位置
extra:null说明用到索引排序了。

explain select * from suoyin_test  ORDER BY qq desc;
explain select * from suoyin_test  ORDER BY id;

在这里插入图片描述
在这里插入图片描述
5、union all,in,or都能够使用索引,但是推荐使用in。
6、范围列可以用到索引,但是范围列后面的列无法用到索引,索引最多用于一个范围列。比如<><=>=between等。
7、隐式转换会造成索引失效

当 where 查询操作符左边为数值类型时发生了隐式转换,那么对效率影响不大,但还是不推荐这么做。 当 where
查询操作符左边为字符类型时发生了隐式转换,那么会导致索引失效,造成全表扫描效率极低。


explain select * from suoyin_test where  name = 23;
explain select * from suoyin_test where  name = '23';

8、被频繁更新的字段应该慎重建立索引。
维护索引的成本是不小的。 如果一个字段不被经常查询,反而被经常修改,那么就更不应该在这种字段上建立索引了。
9、选择合适的字段创建索引。
不为 NULL 的字段、被频繁查询的字段、频繁需要排序的字段、被经常频繁用于连接的字段等。
10、当需要进行表连接的时候,最好不要超过三张表被经常频繁用于连接的字段就特别适合索引。
jion的三个结构如下:(以下来源:https://blog.csdn.net/main_Scanner01/article/details/123786007)
(1)Simple Nested-Loop Join(简单嵌套循环匹配)
在这里插入图片描述
粗暴的进行连接,A每一行连接到非驱动表B的所有行。效率很低,占用内存很大。
(2)Index Nested-Loop Join(嵌套循环连接)
在这里插入图片描述
通过外层表匹配条件直接与内层表索引进行匹配,避免和内层表每层记录进行比较,这样极大的减少了对内层表的匹配次数。
条件就是要在内层表加索引,且连接条件是该索引字段,这样就现在A表查询,然后通过索引进行回表查询。
如果被驱动表加索引,效率是非常高的,但如果索引不是主键索引,所以还得进行一次回表查询。相比,被驱动表的索引是主键索引,效率会更高。
(3)Block Nest-Loop Join(块嵌套循环连接)
在这里插入图片描述
不再是逐条获取驱动表的数据,而是一块一块的获取,引入了join buffer缓冲区,将驱动表join相关的部分数据列(大小受join buffer的限制)缓存到join buffer中,然后全表扫描被驱动表,被驱动表的每一条记录一次性和join buffer中的所有驱动表记录进行匹配(内存中操作),将简单嵌套循环中的多次比较合并成一次,降低了被驱动表的访问频率。
11、能使用limit的时候尽量使用limit。
12、限制每张表上的索引数量(不超过5个最好)。
13、组合索引避免冗余((name,qq)和(qq)这两个索引就是冗余索引)。
14、索引不是越多越好,也不是越早优化越好(业务量上来之后,有了瓶颈再优化也不晚)。

七、索引监控

show status like 'Handler_read%';

在这里插入图片描述

Handler_read_first:读取索引第一个条目的次数,如果该值很高,那表明服务器正在执行很多全索引扫描
Handler_read_key:通过index获取数据的次数,。如果该值很高,那很好的说明了,对于执行的请求,表采用了适当的索引。
Handler_read_last:读取索引最后一个条目的次数
Handler_read_next:通过索引读取下一条数据的次数
Handler_read_prev:通过索引读取上一条数据的次数
Handler_read_rnd:从固定位置读取数据的次数
Handler_read_rnd_next:从数据节点读取下一条数据的次数,该值很高,表明正在执行很多全表扫描。通常表明表没使用适当的索引或者查询请求没利用现成的索引。

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

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

相关文章

计算机图形学 | 实验九:纹理贴图和天空盒

计算机图形学 | 实验九&#xff1a;纹理贴图和天空盒 计算机图形学 | 实验九&#xff1a;纹理贴图和天空盒实验概述顶点数据立方体顶点数据天空盒顶点数组 纹理载入创建纹理纹理读取纹理绑定 使用纹理立方体着色器顶点着色器片元着色器 天空盒着色器顶点着色器片元着色器 立方体…

管好【SD-WEBUI】中大量的模型:模型信息预览插件(Part.3)

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;模型预览图&#xff08;一&#xff09;模型信息预览插件&#xff08;Model Preview&#xff09;&#xff08;1.1&#xff09;示例&#xff08;Markdown描述提示词备注&#xff09;&#xff08;1.2&#xff0…

AI大模型驱动下,数字虚拟人与虚拟场景为高等学院建设带来何种改变?

继今年年初美国人工智能研究实验室OpenAI推出ChatGPT&#xff08;一种人工智能驱动的自然语言处理工具&#xff09;之后一段时间里&#xff0c;阿里、百度、商汤等一众国内IT巨头纷纷发布了各自的AI大模型&#xff08;可浅理解为用于AI学习用的超大量数据&#xff09;&#xff…

运动控制轴单位设置(H5U PLC)

H5U PLC运动控制相关应用,请参看下面博客文章 10轴总线控制(汇川H5UPLC+总线伺服编程应用)_RXXW_Dor的博客-CSDN博客H5UPLC控制总线伺服的详细配置过程,可以参看下面的文章链接:汇川H5U PLC通过EtherCAT总线控制SV660N和X3E伺服_ethercat总线伺服如何控制_RXXW_Dor的博客-C…

使用MFT进行加密文件传输的7个好处

至少&#xff0c;托管文件传输&#xff08;MFT&#xff09;解决方案是一种产品&#xff0c;它包含入站和出站文件传输的所有方面&#xff0c;同时使用行业标准的网络协议和无缝加密。它可以从单个集中管理点在您的网络&#xff0c;系统&#xff0c;应用程序&#xff0c;贸易伙伴…

2024王道数据结构考研丨第二章:线性表

2024王道数据结构考研笔记专栏将持续更新&#xff0c;欢迎 点此 收藏&#xff0c;共同交流学习… 文章目录 第二章&#xff1a;线性表2.1线性表的定义2.2顺序表的定义2.2.1静态分配:2.2.2动态分配 2.2顺序表的基本操作1.插入操作 &#xff1a;平均时间复杂度O(n)2.删除操作&…

小白怎么入门网络安全?看这篇文章就够啦!(2023最新)

作为一名从业多年的网络安全工程师&#xff0c;我了解到&#xff0c;网络安全是一个高度技术密集的领域&#xff0c;它涵盖了网络架构、网络协议、操作系统、编程语言、密码学、安全漏洞、入侵检测和应急响应等多个方面。如果你是零基础的小白&#xff0c;想要进入这个行业&…

5个设计师必备的页面设计工具!

在现代科技飞速发展的时代&#xff0c;设计软件的选择越来越多。本文将盘点 5 大主流页面设计工具其中&#xff0c;即时设计是一款协同页面设计工具&#xff0c;提供在线编辑和保存等功能&#xff0c;同时拥有免费设计素材和在线留言评论等实用功能。它的云端协作设计使得复杂的…

街电入局两轮电动车充电,讲出了“跃迁”式的新故事?

以共享单车为起点&#xff0c;中国的共享经济正蓬勃发展。国家信息中心披露的数据显示&#xff0c;2022年&#xff0c;中国共享经济市场交易规模约38320亿元&#xff0c;同比增长约3.9%。 虽然同属共享经济&#xff0c;但与部分共享单车企业嫁入“豪门”全身而退不同&#xff…

【接口自动化测试】cookie绕过验证码自动登录?(保持登录状态)

目录 前言 cookie工作原理 cookie绕过登录 【自动化测试工程师学习路线】 1、自动化测试必备Python编程内容​ 2、Web UI 自动化测试基础内容​ 3、Web UI 自动化测试实战内容​ 4、APP UI 自动化测试基础内容​ 5、APP UI 自动化测试实战内容​ 6、API 接口自动化测…

实验四 面向对象分析与设计——UML类图与时序图

一、实验目的&#xff1a; 掌握面向对象分析中静态结构模型与动态行为模型的基本思想。学会识别系统中的类、类的属性和操作以及类之间的关系&#xff0c;掌握UML类图的绘制方法。了解时序图的作用和组成元素&#xff0c;掌握UML时序图的绘制方法。 二、实验仪器及实验环境&a…

ATA-2000系列高压放大器在压电陶瓷中的典型应用

ATA-2000系列高压放大器在压电陶瓷中的典型应用 压电陶瓷介绍&#xff1a; 压电陶瓷是一种能够将机械能和电能互相转换的陶瓷材料。压电陶瓷除具有压电性外&#xff0c;还具有介电性、弹性等,已被广泛应用于医学成像、声传感器、声换能器、超声马达等。压电陶瓷利用其材料在机…

改进YOLOv7 | 头部解耦 | 将YOLOX解耦头添加到YOLOv7 | 涨点杀器

改进YOLOv7 | 头部解耦 | 将YOLOX解耦头添加到YOLOv7 论文地址:https://arxiv.org/abs/2107.08430 文章目录 改进YOLOv7 | 头部解耦 | 将YOLOX解耦头添加到YOLOv71. 解耦头原理2. 解耦头对收敛速度的影响3. 解耦头对精度的影响4. 代码改进方式第一步第二步第三步第四步第五步参…

字节跳动测试岗四面总结....

字节一面 1、 简单做一下自我介绍 2、 简要介绍一下项目/你负责的模块/选一个模块说一下你设计的用例 3 、get请求和post请求的区别 4、 如何判断前后端bug/3xx是什么意思 5、 说一下XXX项目中你做的接口测试/做了多少次 6、 http和https的区别 7、 考了几个ADB命令/查看…

NebulaGraph和HugeGraph调研

1、社区资料丰富程度 各平台搜索词条数汇总 图数据库百度搜索必应搜索谷歌搜索CSDN知乎掘金简书语雀githubgiteestackoverflowNebulaGraph261000072600090600128810768131324188202HugeGraph45720001156500530009630170215132811 经过对比&#xff0c;NebulaGraph 在谷歌搜索…

大数据期末复习资料2023 Beta版

大数据单元1在线测试&#xff1a;https://ks.wjx.top/vm/tv3XfFg.aspx# 大数据单元2在线测试&#xff1a;https://ks.wjx.top/vm/QfXBgWP.aspx# 大数据单元3在线测试-1&#xff1a;https://ks.wjx.top/vm/PeLX5WR.aspx# 大数据单元3在线测试-2&#xff1a;https://ks.wjx.top/v…

重磅来袭,ChatGPT官方的掌上神器目前仅支持IOS

今天凌晨&#xff0c;OpenAI 推出了 ChatGPT 的 iOS app&#xff0c;在这个开放的世界里&#xff0c;智能化的 AI 功能早已经突破了人类的想象力。而 ChatGPT 确实不会让我们失望&#xff0c;它的真「iPhone 时刻」来了&#xff01;从现在起&#xff0c;我们可以在 iPhone 上使…

3面美团测试岗,HR现场直接发20k的offer,我是横着走出来的...

前情提要 这是一个发生在我身上的真实事情&#xff1a; 我工作不到2年&#xff0c;周末在朋友圈发了个喜报&#xff0c;准备入职美团。之后&#xff0c;我的朋友就带着祝福跟我聊了许久&#xff0c;聊天的内容就是具体了解一下我面试的过程&#xff0c;心路历程和未来的打算…

解决方案|电源适配器自动测试系统ATECLOUD-Power

随着电子产品的不断普及&#xff0c;电源适配器的应用越来越广泛。然而&#xff0c;在生产过程中&#xff0c;适配器电源的质量是至关重要的。为了确保电子产品的质量&#xff0c;适配器电源需要经过严格的测试和验证。传统的适配器电源测试方法需要大量的人力和时间&#xff0…

如何让数据安全管理工作化繁为简?uDSP 十问十答

数据安全管理工作与国家数据安全、企业资产保护以及个人信息保护工作息息相关。复杂、多元、流通的数据也给数据安全带来了更多的威胁和挑战&#xff0c;如数据资产管理、分类分级问题&#xff0c;数据安全集中管控问题&#xff0c;数据共享与流通问题等。原点安全一体化数据安…