小索引大力量,记一次explain的性能优化经历

在 MySQL 的生产环境中,性能问题是一个常见的挑战。当数据库查询响应时间变慢,或者系统资源消耗异常时,我们需要快速定位问题并进行优化。MySQL 提供了一个强大的工具——EXPLAIN,它可以帮助我们分析查询语句的执行计划,从而找到性能瓶颈。

本文模拟之前生产环境mysql性能问题的优化过程,对生产环境的复盘。系统上线后正常使用,大概1年后就出现业务慢,运维反馈某些业务操作会让服务器cpu飙升到100%以上。

准备

理解 EXPLAIN 输出

EXPLAIN 命令可以附加在任何 SQL 查询语句之前,用于显示 MySQL 如何执行该查询。输出结果包含多个字段,每个字段都提供了关于查询执行的重要信息。

以下是 EXPLAIN 输出中的一些关键字段:

  • id:查询标识符,表示查询中操作的顺序。
  • select_type:查询的类型,如 SIMPLE、SUBQUERY、DERIVED 等。
  • table:查询涉及的表。
  • type:访问类型,如 ALL、index、range、ref 等,反映了 MySQL 查找行的方式。
  • possible_keys:可能用到的索引。
  • key:实际使用的索引。
  • key_len:使用的索引长度。
  • ref:显示索引的哪一列被使用了。
  • rows:MySQL 认为必须检查的用来返回请求数据的行数。
  • Extra:包含不适合在其他列中显示但十分重要的额外信息。
  • filtered:表示通过查询条件过滤后,返回的行数与rows列估计的行数的比例。这个值越高,表示查询的过滤效果越好。

MySQL开启慢查询

在使用EXPLAIN之前,确实需要确保MySQL的慢查询日志功能已经开启,因为慢查询日志记录了执行时间超过阈值的SQL语句,这些语句往往是性能调优的重点。

以下是配置MySQL慢查询日志的步骤:

1. 配置慢查询日志参数

在配置文件中my.cnf或my.ini,找到或添加以下参数来配置慢查询日志:

vim /etc/mysql/my.cnf

[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
log_queries_not_using_indexes = 1
  • slow_query_log = 1:启用慢查询日志。
  • slow_query_log_file = /var/log/mysql/mysql-slow.log:指定慢查询日志文件的路径。请确保MySQL服务有权限写入这个文件。
  • long_query_time = 2:设置慢查询的阈值,单位是秒。这里设置为2秒,执行时间超过2秒的查询会被记录到慢查询日志中。
  • log_queries_not_using_indexes = 1:如果设置为1,MySQL会记录那些没有使用索引的查询,即使它们的执行时间没有超过long_query_time的阈值。

2. 重启MySQL服务

保存配置文件后,你需要重启MySQL服务以使更改生效。在Linux系统中,可以使用以下命令重启MySQL服务:

service mysql restart

3. 验证慢查询日志配置

重启服务后,你可以通过以下SQL语句来验证慢查询日志是否已经正确配置:

mysql -uroot -p
SHOW VARIABLES LIKE 'slow_query_log%';

确保slow_query_log的值为ONslow_query_log_file指向正确的日志文件路径。

DBA不让开慢查询

如果说公司DBA不让开启慢查询。

理由是:

慢查询日志会记录执行时间超过指定阈值的SQL语句,这会导致日志文件的增长。

每次记录慢查询日志时,都会涉及到磁盘I/O操作,这可能会对数据库的写入性能产生影响。尤其是在高负载环境下,频繁的磁盘写入可能会略微降低数据库的整体性能。

记录慢查询的过程可能会增加查询执行的额外开销。这种开销通常很小,但在极端情况下,对于那些非常接近慢查询阈值的查询,可能会因为记录日志而导致它们被错误地标记为慢查询。

这时可以通过重现业务操作,触发慢查询,然后执行

select * from information_schema.`PROCESSLIST` where info is not null;

查询当前有哪些脚本正在执行及占用时间

准备阶段最核心的作用就是找出性能比较差的脚本是哪些。找到了就可以进行下一步的explain。

性能调优

使用 EXPLAIN 的步骤

步骤 1:识别慢查询

首先,我们需要识别出哪些查询是慢查询。可以通过 MySQL 的慢查询日志或者监控工具来获取这些信息。

调取慢查询日志文件

tail -f /var/log/mysql/mysql-slow.log

步骤 2:使用 EXPLAIN 分析查询

把慢查询SQL脚本,使用 EXPLAIN 来分析这些查询

步骤 3:解读 EXPLAIN 输出

调整前:

explain结果

分析 EXPLAIN 的输出,特别关注以下几个方面:

  • type:如果 typeALL,表示进行了全表扫描,这通常是性能问题的标志。如果 typeALL,考虑创建索引。

    • ALL:全表扫描(Full Table Scan)。
    • index:索引扫描(Index Scan)。与全表扫描类似,但数据库扫描的是整个索引,而不是表。
    • range:范围扫描(Range Scan)。数据库使用索引来检索特定范围内的行。
    • ref:索引查找(Index Lookup)。数据库使用非唯一索引来查找与单个列上的等值条件匹配的行。
    • eq_ref:唯一索引查找(Unique Index Lookup)。
    • NULL:表示查询不需要访问表或索引,数据库可以直接从索引中获取结果,而不需要访问表。
  • key:实际使用的索引名称,如果 keyNULL,表示没有使用索引,需要创建或优化索引。
  • rows:如果 rows 的值很大,表示 MySQL 需要检查很多行,这可能是性能瓶颈。尝试优化查询条件,减少需要检查的行数。
  • Extra:如果出现了 Using filesortUsing temporary,这些都是性能问题的信号。

步骤 4:验证优化效果

在实施优化措施后,重新使用 EXPLAIN 分析查询,并监控查询的实际执行时间,以验证优化效果。

此次生产上的问题主要是没有增加索引,这里还没对SQL本身进行大量优化。比如

  • like使用左右%时,索引会失效
  • 尽量不要使用三表或三表以上的联合查询
  • 尽量减少In的使用
  • .....

此次复盘的主要目的是了解explain的基本概念及使用步骤。

另外还有非常重要的一点就是项目成员重视索引的重要性,建表时索引就一条语句而已。项目初期数据量小或许体现不出来,但当数据量大了的情况下索引的能力就尤为突出。

https://juejin.cn/post/7370841518791360547

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前后端实现文件上传进度条-实时进度

后端接口代码&#xff1a; PostMapping("/upload")public ResponseEntity<String> handleFileUpload(RequestParam("file") MultipartFile file) {try {// 获取文件名String fileName file.getOriginalFilename();// 创建上传目标路径Path targetPa…

读书笔记-Java并发编程的艺术-第2章 Java并发机制的底层实现原理

文章目录 2.1 volatile的应用2.1.1 volatile的定义与实现原理2.1.2 volatile的使用优化 2.2 synchronized的实现原理与应用2.2.1 Java对象头2.2.2 锁的升级与对比2.2.2.1 偏向锁2.2.2.2 轻量级锁2.2.2.3 锁的优缺点对比 2.3 原子操作的实现原理2.3.1 术语定义2.3.2 处理器如何实…

Linux 内存管理 SLUB 分配器

文章目录 前言一、SLUB allocator二、SLUB core参考资料 前言 本文来自&#xff1a;https://lwn.net/Articles/229984/ [Posted April 11, 2007 by corbet]SLAB分配器是用于处理“频繁分配和释放的对象”的对象缓存内核内存分配器。它是内存管理子系统中关键的一部分&#xf…

Opencv 色彩空间

一 核心知识 色彩空间变换&#xff1b; 像素访问&#xff1b; 矩阵的、-、*、、&#xff1b; 基本图形的绘制 二 颜色空间 RGB&#xff1a;人眼的色彩空间&#xff1b; OpenCV默认使用BGR&#xff1b; HSV/HSB/HSL; YUV(视频); 1 RGB 2 BGR 图像的多种属性 1 访问图像(Ma…

MySQL之查询性能优化(三)

查询性能优化 重构查询的方式 在优化有问题的查询时&#xff0c;目标应该是找到一个更优的方法获得实际需要的记过——而不是一定总是需要从MySQL获取一模一样的结果集。有时候&#xff0c;可以将查询转换一种写法让其返回一样的结果&#xff0c;但是性能更好。但也可以通过修…

关于URL获取的参数,无法执行二选一查询

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

Arthas调优工具使用

1&#xff0c;服务器端下载 curl -O https://arthas.aliyun.com/arthas-boot.jar 2&#xff0c;服务器端启动 java -jar arthas-boot.jar 选定要绑定的Java进程ID 3&#xff0c;本地idea安装Arthas idea 4&#xff0c;选定方法右键trace,生成命令 trace com.xxx.xxx.xxx.vouche…

C++之noexcept

目录 1.概述 2.noexcept作为说明符 3.noexcept作为运算符 4.传统throw与noexcept比较 5.原理剖析 6.总结 1.概述 在C中&#xff0c;noexcept是一个关键字&#xff0c;用于指定函数不会抛出异常。如果函数保证不会抛出异常&#xff0c;编译器可以进行更多优化&#xff0c;…

Spring Boot既打jar包又打war包如何做

你好&#xff0c;我是柳岸花开。 引言 在软件开发中&#xff0c;根据不同的部署需求&#xff0c;我们可能需要将应用打包成不同的格式。Spring Boot作为目前流行的Java应用开发框架&#xff0c;提供了一种简单的方式来打包应用。本文将介绍如何利用Maven Profiles在Spring Boot…

JDK8安装详细教程教程-windows

&#x1f4d6;JDK8安装详细教程教程-windows ✅1. 下载✅2. 安装 ✅1. 下载 123云盘下载地址&#xff1a; JDK8 | JDK11 | JDK17 官方Oracle地址&#xff1a;https://www.oracle.com/java/technologies/downloads/archive/ ✅2. 安装 运行jdk-8u211-windows-x64.exe安装包文…

Blog项目切换Markdown编辑器———LayUI弹出层弹出写在页面的内容导致的各种bug

【2024.5.24回顾】 1 问题描述(描述完自己解决了…) 正常情况 点击添加文章按钮后&#xff0c;弹出文章编辑界面&#xff0c;如果用富文本功能编辑&#xff0c;则一切正常。可以多次打开、关闭 Markdown 如果在弹出层中点击了切换编辑器按钮&#xff0c;会成功切换为markd…

FreeRTOS的使用与编码器设计

第一步&#xff1a;任务创建&#xff1a;在 FreeRTOS 中&#xff0c;系统功能由任务&#xff08;Task&#xff09;组成。在系统启动时&#xff0c;你需要创建各个任务并指定它们的任务频率、优先级、堆栈大小等参数。 xTaskCreate() 来创建开始任务并定义任务的执行函数、优先级…

Java之instanceof 运算符:掌握它的使用方法

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

人工智能--深度神经网络

目录 &#x1f349;引言 &#x1f349;深度神经网络的基本概念 &#x1f348;神经网络的起源 &#x1f34d; 神经网络的基本结构 &#x1f349;深度神经网络的结构 &#x1f348; 卷积神经网络&#xff08;CNN&#xff09; &#x1f348;循环神经网络&#xff08;RNN&…

期权懂基础知识分享:场外期权怎么做?

今天带你了解期权懂基础知识分享&#xff1a;场外期权怎么做&#xff1f;场外个股期权是一种金融工具&#xff0c;用于在股票市场之外交易。 场外期权怎么做&#xff1f; 签订框架协议&#xff1a;个人需要与机构签订场外期权框架协议&#xff0c;通常无需单独开立账户。 询价…

Web3.0区块链技术开发方案丨中心化与去中心化交易所开发

随着区块链技术的不断发展和普及&#xff0c;加密货币交易所成为数字资产市场中的关键组成部分。其中&#xff0c;中心化交易所&#xff08;CEX&#xff09;和去中心化交易所&#xff08;DEX&#xff09;是两种主要的交易所类型。本文将探讨Web3.0区块链技术开发方案&#xff0…

【Postman接口测试】第四节.Postman接口测试项目实战(中)

文章目录 前言五、Postman断言 5.1 Postman断言介绍 5.2 响应状态码断言 5.3 包含指定字符串断言 5.4 JSON数据断言六、参数化 5.1 Postman参数化介绍 5.2 Postman参数化实现 5.3 针对项目登录接口参数化实现 总结 前言 五、Postman断言 5.1 Postman断言介…

Android 应用权限

文章目录 权限声明uses-permissionpermissionpermission-grouppermission-tree其他uses-feature 权限配置 权限声明 Android权限在AndroidManifest.xml中声明&#xff0c;<permission>、 <permission-group> 、<permission-tree> 和<uses-permission>…

TSINGSEE青犀视频汇聚机房动环智能监控方案,提升机房安全稳定性

一、背景需求 在当今信息化时代&#xff0c;机房作为数据中心的核心设施&#xff0c;承载着重要的网络设备和数据存储设备&#xff0c;其正常运行对于企业的数据安全和业务连续性至关重要。机房内部设备众多&#xff0c;且运行过程中涉及大量的数据交换和传输。一旦发生安全事…

[C][数据结构][时间空间复杂度]详细讲解

目录 0.铺垫1.时间复杂度 -- 衡量算法的运行快慢1.是什么&#xff1f;2.大O的渐进表示法 2.空间复杂度 - 衡量算法所需要的额外空间3.常见复杂度对比 0.铺垫 时间是累计的空间是不累计的&#xff0c;可以重复利用 1.时间复杂度 – 衡量算法的运行快慢 1.是什么&#xff1f; …