当前位置: 首页 > news >正文

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

  • 为什么MySQL的MyISAM和InnoDB存储引擎索引底层选择B+树,而不是B树?
  • 哈希索引:
  • 具体项目实践步骤:

为什么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+树)上的二级索引值,在内存上构建一个哈希索引,以加快搜索。

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

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.举例子,解决问题

可通过

show variables like 'profiling';

查看profiling的运行状态

set profiling = on;

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

相关文章:

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

为什么MySQL的MyISAM和InnoDB存储引擎索引底层选择B树,而不是B树?哈希索引:具体项目实践步骤: 为什么MySQL的MyISAM和InnoDB存储引擎索引底层选择B树,而不是B树? 对于B树: 索引数据内容分散在不…...

C++库之一:Loki

Loki 是一个轻量级的 C 模板库,旨在为高性能和灵活的 C 编程提供强大的设计模式和技术。它最初由 Andrei Alexandrescu 在他的著作《Modern C Design: Generic Programming and Design Patterns Applied》一书中介绍。 Loki 的核心特点 Loki 库的设计是为了支持复…...

前后端时间转换的那些常见问题及处理方法

在现代的Web开发中,前后端分离的架构已经成为主流,尤其是在Spring Boot和Vue.js的组合中。开发者在这种架构下经常遇到的一个问题就是如何处理时间的转换和显示。前端和后端对时间的处理方式不同,可能会导致时间在传递过程中出现问题&#xf…...

怎么利用XML发送物流快递通知短信

现如今短信平台越来越普遍了,而短信通知也分很多种,例如服务通知、订单通知、交易短信通知、会议通知等。而短信平台在物流行业通知这一块作用也很大。在家时:我们平时快递到了,如果电话联系不到本人,就会放到代收点,然…...

什么是CPU、GPU、NPU?(包懂+会)

目录 举例子 CPU:主厨 GPU:大量的厨房助理 NPU:面包机 总结 讲理论 CPU(中央处理器) GPU(图形处理单元) NPU(神经网络处理单元) 对比分析 举例子 CPU&#xff…...

TypeScript接口

接口 在编程中,接口是一种编程规范,它定义了行为和动作规范,接口起到了规范的作用,比如长方形必须要有长和宽,至于是多少不管,但是必须要有, 接口不关心实现的细节是什么。 interface vs type…...

Java | Leetcode Java题解之第397题整数替换

题目: 题解: class Solution {public int integerReplacement(int n) {int ans 0;while (n ! 1) {if (n % 2 0) {ans;n / 2;} else if (n % 4 1) {ans 2;n / 2;} else {if (n 3) {ans 2;n 1;} else {ans 2;n n / 2 1;}}}return ans;} }...

MySQL的 where 1=1会不会影响性能

MySQL的 where 11会不会影响性能? 一、引言 在编写SQL语句时,我们经常会遇到需要动态拼接查询条件的情况,尤其是在使用MyBatis这类ORM框架时。为了简化代码,很多开发者会使用where 11来开始他们的查询语句,然后通过程…...

工业连接器 如何有效提高自动化生产?

随着工业4.0的推进,生产自动化已经成为现代制造业的重要趋势。在这一过程中,工业连接器作为电气系统的关键组件,扮演着至关重要的角色。工业连接器不仅确保了设备间的稳定连接,而且在提高生产效率、保障系统可靠性以及支持设备间的…...

虚表生成时机与多态开始时机

虚表生成在父类构造完之后,子类构造之前 ,生成父类虚表,再执行子类的构造,这时虚表已经重写,可以多态(即开始派生类构造初始化列表代码)。 验证:输出This is animal miao miao mia…...

web前端面试题精选

1. W3C标准有哪些? W3C推行的主要规范有HTML,CSS,XML,XHTML和DOM(Document Object Model)。2. 谈谈Js的内存泄露问题。 3. 谈谈对Html 5的了解。 4. 谈谈对CSS 3的了解。 5. 用js实现随即选取10--100之间的10个数字,存入一个数组,并排序。 var iArray = []; funt…...

程序员转型大模型开发,可以转型成功吗?

序员转型成为大模型(如深度学习或大规模语言模型)的开发者是完全可能的,尤其是随着人工智能领域的快速发展,这一领域的需求也在不断增长。以下是一些步骤和建议,可以帮助程序员顺利地进行这种职业转型: 学习…...

Threejs之球发射实战

本文目录 前言一、效果预览二、代码实现及解析2.1 代码2.2 解析 前言 本篇将基于Threejs之模拟小球反弹基础上以及Threejs这个专栏学习过的知识点上进行小球更加真实的物理运动轨迹,并且还会与鼠标进行交互的操作。由于知识点都在上篇均有涉及,本篇就不过…...

详解新规|逐条分析《电子认证服务管理办法(征求意见稿)》修订重点

近日,工信部就《电子认证服务管理办法(征求意见稿)》公开征求意见。 来源|公开资料 图源|Pixabay 编辑|公钥密码开放社区 《电子认证服务管理办法》(以下简称《办法》)于2009年2…...

哪个编程工具让你的工作效率翻倍?

✍️作者简介:小北编程(专注于HarmonyOS、Android、Java、Web、TCP/IP等技术方向) 🐳博客主页: 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN 🔔如果文章对您有一定的帮助请&#x1f…...

SEW变频器的特点

SEW变频器是德国SEW-EURODRIVE GmbH公司生产的一种变频器产品,该公司是全球领先的驱动技术和系统解决方案提供商之一。以下是关于SEW变频器的详细介绍: 一、产品特点 高效节能:SEW变频器采用先进的电力电子技术和控制技术,能够实…...

大象机械人------1、关节控制

回到首页 目录 1 单关节控制 角度控制:1.1 send_angle(id, degree, speed)电位值控制:1.2 set_encoder(joint_id, encoder) 2 多关节控制 获取所有角度:2.1 get_angles()角度控制:2.2 send_angles(degrees, speed)电位值控制&…...

油电叉车倒车防撞报警系统精准探测

油电叉车倒车防撞报警系统通过集成最新的传感器技术、图像识别算法以及智能控制技术‌,通过实时监测叉车周围环境中的障碍物、行人和其他叉车,及时发出警报,避免可能的碰撞事故。 油电叉车倒车防撞报警系统功能详解 精准探测 叉车倒车时&a…...

Java学习路线:从零基础到高级开发者的完整指南

初学者入门指南 1. 环境搭建 安装JDK: 下载并安装最新版本的JDK(Java Development Kit)。配置环境: 设置JAVA_HOME环境变量,并将bin目录添加到PATH中。选择IDE: 使用Eclipse、IntelliJ IDEA或其他任何你喜欢的Java集成开发环境。 2. Java基…...

【Java算法】递归

🔥个人主页: 中草药 🔥专栏:【算法工作坊】算法实战揭秘 🍇一.递归 概念 递归是一种解决问题的方法,其中函数通过调用自身来求解问题。这种方法的关键在于识别问题是否可以被分解为若干个相似但规模更小…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

从实验室到产业:IndexTTS 在六大核心场景的落地实践

一、内容创作&#xff1a;重构数字内容生产范式 在短视频创作领域&#xff0c;IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色&#xff0c;生成的 “各位吴彦祖们大家好” 语音相似度达 97%&#xff0c;单条视频播放量突破百万…...