Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【MySQL】索引的使用与调优技巧

【MySQL】索引的使用与调优技巧

作者头像
洁洁
发布于 2024-09-13 05:32:22
发布于 2024-09-13 05:32:22
12500
代码可运行
举报
文章被收录于专栏:小洁叫你mysql小洁叫你mysql
运行总次数:0
代码可运行

为什么MySQL的MyISAM和InnoDB存储引擎索引底层选择B+树,而不是B树?

  • 对于B树: 索引+数据内容分散在不同的节点上,离根节点近,搜索就快,离根节点远,搜索就慢。 花费的磁盘IO次数不平均,每一行数据搜索花费的时间也不平均。 每一个非叶子节点上,不仅仅要存储索引(key)还要存储索引值所在那一行的data数据。一个节点所能存放的索引key值的个数,比只存储索引key值的个数要少很多。 B树不方便做范围搜索,整表遍历也不方便。
  • 对于B+树: 每一个非叶子节点,只存放key,不存放data,好处就是一个节点可以存放更多的key值,在理论上来说,层数会更低,搜索效率会更高。 叶子节点上存储了所有的索引值和数据data,搜索每一个索引对应的值data,都需要到达叶子节点上,这样每一行数据搜索花费的时间非常平均。 叶子节点被串在一个链表当中,形成了一个有序链表,如果要进行索引树的搜索或者整表搜索或者范围搜索,可直接遍历有序链表,效率大大提升。

哈希索引:

基于哈希表数据结构实现,时间复杂度是O(1)。对于memory内存的存储引擎操作比较适合,不适合磁盘IO操作。哈希索引没办法处理磁盘上的数据,加载到内存上构建高效的搜索数据结构,因为它没有办法减少磁盘IO次数。 由于哈希表中的元素没有顺序,哈希索引只适合等值搜索比较,不适合范围搜索,前缀搜索,ORDER BY排序等。

在InnoDB存储引擎下,对于频繁的使用二级索引会被自动优化–自适应哈希索引,即它会根据这个二级索引,在内存上根据二级索引树(B+树)上的二级索引值,在内存上构建一个哈希索引,以加快搜索。

自适应哈希索引本身的数据维护也是要耗费性能的,并不是说自适应哈希索引在任何情况下都会提升二级索引的查询性能。应该按照参数指标,来具体分析是否打开或关闭自适应哈希索引。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
show engine innodb status\G;

主要可以看到: 1. 出现RW-latch,等待的线程数量(自适应哈希索引默认分配了8个分区)同一个分区等待的线程数量过多 2. 0.00 hash searches/s, 0.00 non-hash searches/s 可以看到自适应哈希索引搜索的使用频率和二级索引树搜索的频率。当自适应哈希索引搜索的使用频率低时,要考虑关闭自适应哈希索引。

下面是官方文档介绍: In MySQL 5.7, the adaptive hash index search system is partitioned. Each index is bound to a specific partition, and each partition is protected by a separate latch. Partitioning is controlled by the innodb_adaptive_hash_index_parts configuration option. In earlier releases, the adaptive hash index search system was protected by a single latch which could become a point of contention under heavy workloads. The innodb_adaptive_hash_index_parts option is set to 8 by default. The maximum setting is 512. The hash index is always built based on an existing B-tree index on the table. InnoDB can build a hash index on a prefix of any length of the key defined for the B-tree, depending on the pattern of searches that InnoDB observes for the B-tree index. A hash index can be partial, covering only those pages of the index that are often accessed. You can monitor the use of the adaptive hash index and the contention for its use in the SEMAPHORES section of the output of the SHOW ENGINE INNODB STATUS command. If you see many threads waiting on an RW-latch created in btr0sea.c, then it might be useful to disable adaptive hash indexing.

具体项目实践步骤:

1.通过慢查询日志 可设置合理的,业务可以接收的慢查询时间 2.压测执行各种业务 3.查看慢查询日志,找出所有的执行耗时的sql语句 4.用explain分析这些耗时的sql 5.举例子,解决问题

可通过

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
show variables like 'profiling';

查看profiling的运行状态

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set profiling = on;

show profiles; 查看sql语句具体详细的耗费时间。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数据结构项目——单向链表[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170976.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/23
2060
数据结构项目——单向链表[通俗易懂]
2024重生之回溯数据结构与算法系列学习(6)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
要实现高效删除,可以使用一个哈希表来记录已经出现过的数值的绝对值。使用哈希表的原因是其查找和插入操作的时间复杂度为O(1)。这样我们可以在线性时间内(O(n))遍历链表,并处理每个节点是否需要删除。
盛透侧视攻城狮
2025/05/19
940
2024重生之回溯数据结构与算法系列学习(6)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
循环单链表解决约瑟夫环_用链表解决约瑟夫环问题
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170977.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/23
3110
循环单链表解决约瑟夫环_用链表解决约瑟夫环问题
单链表反转的分析及实现
我先画一个单链表,这个单链表有4个元素。我的思路就是,每次把第二个元素提到最前面来。比如下面是第一次交换,我们先让头结点的next域指向结点a2,再让结点a1的next域指向结点a3,最后将结点a2的
猿人谷
2018/01/17
2.3K0
单链表反转的分析及实现
2024重生之回溯数据结构与算法系列学习(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
盛透侧视攻城狮
2024/10/22
1400
2024重生之回溯数据结构与算法系列学习(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
算法题目(二)
题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为旋转。 输入一个递增的排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小元素为1.
Helloted
2022/06/06
3760
算法题目(二)
2024重生之回溯数据结构与算法系列学习(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
盛透侧视攻城狮
2024/12/25
1410
2024重生之回溯数据结构与算法系列学习(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
02-线性结构2 一元多项式的乘法与加法运算
设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
废江_小江
2022/09/05
5750
2024重生之回溯数据结构与算法系列学习(4)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
将一个带头结点的单链表A分解为两个带头结点的单链表A和B,使得A表中含有原表中序号为奇数的元素,而B表中含有原表中序号为偶数的元素,且保持其相对顺序不变。
盛透侧视攻城狮
2024/10/22
1450
2024重生之回溯数据结构与算法系列学习(4)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构实验之链表
1、线性表: 线性表是最基本的一种数据结构。线性表是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。
LucianaiB
2025/05/28
990
数据结构实验之链表
单链表的基本操作
实现单链表的增加删除定位等功能。(编译执行环境vc6.0,因为目标院校上机考是用这个版本的)
用户2417870
2019/09/18
7330
【数据结构】链表—C/C++实现
尾插法创建:(额...头插和尾插会一个就行,因为尾插法创建的顺序和输入数组一样所以习惯了)
SarPro
2024/02/20
2980
c++单链表的基本操作(全)
俩个基本插入方法 #include <bits/stdc++.h> using namespace std; typedef struct LNode { int date; //节点的数据域 struct LNode *next; //节点的指针域 }LNode,*LinkList; // LinkList 为指向结构体LNode的指针类型 bool Initlist_L(LinkList &L) //构造一个空的单链表L { L = new
莫浅子
2022/11/18
6880
c++单链表的基本操作(全)
两个非递增的有序链表的合并
已知两个带头结点的非递增有序的单链表A和B,设计算法将两个单链表合并成一个非递增有序的单链表C.要求单链表C仍使用原来两个链表的存储空间
别团等shy哥发育
2023/02/27
9470
【编码狂想】解锁基础、分支和循环语法的终极秘籍!
键盘输入两个 int 范围的正整数 a 和 b,范围为[1, 9999],输出这两个 int 范围的正整数的和,差,积,商,模(若 a > b 则输出 a - b,a / b,a % b 的值反之输出 b - a,b / a,b % a 的值,不考虑小数)
SarPro
2024/02/20
1590
数据结构代码题-链表
2.在带头结点的单链表L中,删除所有值为x的结点,并释放其空间,假设值为x的结点不唯一,试编写算法以实现上述操作。
愷龍
2023/10/16
4500
数据结构代码题-链表
2024重生之回溯数据结构与算法系列学习(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
盛透侧视攻城狮
2024/10/22
1040
2024重生之回溯数据结构与算法系列学习(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
https://netsecur-cloud-ljs.blog.csdn.net/article/details/142536066
盛透侧视攻城狮
2024/10/22
1210
2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
链表的合并c++
#include <iostream> #include <string> using namespace std; typedef struct LNode { int date; //节点的数据域 struct LNode *next; //节点的指针域 }LNode,*LinkList; // LinkList 为指向结构体LNode的指针类型 void mergelinklist(LinkList La,LinkList Lb,LinkList &Lc)
莫浅子
2022/11/18
6390
数据结构 第4讲 单链表
链表是线性表的链式存储方式,逻辑上相邻的数据在计算机内的存储位置不一定相邻,那么怎么表示逻辑上的相邻关系呢?可以给每个元素附加一个指针域,指向下一个元素的存储位置。如图所示:
rainchxy
2018/09/13
6950
数据结构 第4讲 单链表
推荐阅读
数据结构项目——单向链表[通俗易懂]
2060
2024重生之回溯数据结构与算法系列学习(6)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
940
循环单链表解决约瑟夫环_用链表解决约瑟夫环问题
3110
单链表反转的分析及实现
2.3K0
2024重生之回溯数据结构与算法系列学习(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
1400
算法题目(二)
3760
2024重生之回溯数据结构与算法系列学习(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
1410
02-线性结构2 一元多项式的乘法与加法运算
5750
2024重生之回溯数据结构与算法系列学习(4)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
1450
数据结构实验之链表
990
单链表的基本操作
7330
【数据结构】链表—C/C++实现
2980
c++单链表的基本操作(全)
6880
两个非递增的有序链表的合并
9470
【编码狂想】解锁基础、分支和循环语法的终极秘籍!
1590
数据结构代码题-链表
4500
2024重生之回溯数据结构与算法系列学习(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
1040
2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
1210
链表的合并c++
6390
数据结构 第4讲 单链表
6950
相关推荐
数据结构项目——单向链表[通俗易懂]
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验