当前位置: 首页 > 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算法】递归

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

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...

Spring AOP代理对象生成原理

代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...

《Offer来了:Java面试核心知识点精讲》大纲

文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...