MySQL数据库——常见慢查询优化方式
本文详细介绍MySQL的慢查询相关概念,分析步骤及其优化方案等。

文章目录
- 什么是慢查询日志?
- 慢查询日志的相关参数
- 如何启用慢查询日志?
- 方式一:修改配置文件
- 方式二:通过命令动态启用
- 分析慢查询日志
- 方式一:直接查看日志文件
- 方式二:使用`EXPLAIN`分析查询
- 常见的慢查询优化
- 1. 数据类型优化
- 2. 索引优化
- 3. SQL 查询优化
- 4. 分库分表
- 慢查询日志的适用场景
- 慢查询日志的优缺点
- 总结
什么是慢查询日志?
慢查询日志是MySQL提供的一种日志记录机制,用于记录执行时间超过指定阈值(long_query_time)的SQL语句。通过慢查询日志,可以识别和优化性能较差的SQL查询,是数据库性能调优的重要工具。
- 关键点:
- 默认阈值:
long_query_time默认值为 10秒,表示运行时间超过10秒的SQL会被记录。 - 默认状态:MySQL 默认未开启慢查询日志,需要手动启用。
- 日志存储方式:支持存储为文件或表。
- 默认阈值:
慢查询日志的相关参数
MySQL慢查询日志的核心参数及其含义如下:
-
启用和路径配置:
slow_query_log:是否开启慢查询日志,1表示开启,0表示关闭。slow-query-log-file:日志文件路径和名称(MySQL 5.6及以上版本)。log-slow-queries:旧版(MySQL 5.6以下)的日志存储路径参数。
-
时间阈值:
long_query_time:慢查询的时间阈值,单位是秒。运行时间超过该阈值的查询将被记录到慢查询日志中。
-
其他参数:
log_queries_not_using_indexes:未使用索引的查询也会记录到慢查询日志中,帮助识别潜在的索引问题(可选)。log_output:定义日志的存储方式:'FILE':将日志写入文件(默认)。'TABLE':将日志记录到mysql.slow_log表中。'FILE,TABLE':同时使用文件和表存储。
如何启用慢查询日志?
方式一:修改配置文件
- 打开 MySQL 配置文件(
my.cnf或my.ini)。 - 添加以下配置:
slow_query_log = 1 slow_query_log_file = /path/to/mysql-slow.log long_query_time = 2 log_queries_not_using_indexes = 1 log_output = 'FILE' - 重启 MySQL 服务以生效。
方式二:通过命令动态启用
使用 MySQL 提供的全局变量来开启慢查询日志:
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 2;
SET GLOBAL log_queries_not_using_indexes = 1;
SET GLOBAL log_output = 'FILE';
注意:动态配置的参数在重启后失效,需将参数写入配置文件以持久化。
分析慢查询日志
方式一:直接查看日志文件
慢查询日志文件以文本格式存储,可以使用 cat、tail 或日志分析工具查看。
方式二:使用EXPLAIN分析查询
EXPLAIN 命令用于模拟优化器的查询执行计划,帮助分析SQL语句的性能问题。
例如:
EXPLAIN SELECT * FROM res_user ORDER BY modifiedtime LIMIT 0,1000;
-
EXPLAIN列说明:
table:查询涉及的表。type:访问类型,从高到低依次为:const、eq_ref、ref、range、index、ALL。rows:预计扫描的行数。key:使用的索引。Extra:补充信息,比如是否使用了临时表或文件排序。
-
type的类型和效率:ALL:全表扫描,效率最低。index:全索引扫描。range:索引范围扫描。ref:非唯一索引扫描或唯一索引前缀扫描。eq_ref:唯一索引扫描,效率较高。const/system:常量查询,效率最高。
常见的慢查询优化
优化 MySQL 的慢查询是提升数据库性能的关键环节。以下是常见的慢查询优化方法,按步骤和具体技术进行详细介绍:
1. 数据类型优化
- 使用占用空间更小的字段类型:
- 优先使用
TINYINT、SMALLINT,而非INT。 - 固定长度的字符串使用
CHAR,而非VARCHAR。 - 使用
TIMESTAMP而非DATETIME,减少存储空间。TIMESTAMP占用 4 字节,而DATETIME占用 8 字节。TIMESTAMP的时间范围为 1970-2038,而DATETIME为 1000-9999,TIMESTAMP更节省空间并且在 UTC 时间格式下自动处理时区转换。
- 精度要求较高时使用
DECIMAL或BIGINT:- 如果需要精确的数字存储,特别是涉及到小数的场景,使用
DECIMAL类型而非FLOAT或DOUBLE。例如,对于要求两位小数的金额字段,可以将值乘以 100 保存为BIGINT。
- 如果需要精确的数字存储,特别是涉及到小数的场景,使用
- 优先使用
2. 索引优化
索引是优化慢查询最常见和高效的方法。以下是索引优化的几种方式:
-
创建适合的索引:
- 对
WHERE子句中频繁使用的列建立索引。 - 对
GROUP BY、ORDER BY和JOIN操作中涉及的列建立索引。
CREATE INDEX idx_column_name ON table_name(column_name); - 对
-
联合索引:
如果查询中涉及多个条件,可以创建联合索引。注意最左前缀原则。CREATE INDEX idx_multi_columns ON table_name(column1, column2); -
覆盖索引:
通过索引覆盖查询的所有字段,减少回表操作。SELECT col1, col2 FROM table_name WHERE col1 = 1; -
避免冗余索引:
合理设计索引,避免不必要的重复索引。例如(a, b)的索引已经可以覆盖a的查询,没必要再单独为a创建索引。
3. SQL 查询优化
优化 SQL 查询语句本身是提高性能的重要手段。
-
避免
SELECT *:
只查询必要的字段,减少数据传输量。SELECT col1, col2 FROM table_name WHERE condition; -
避免子查询,改用 JOIN:
子查询在某些情况下会导致性能下降,特别是嵌套子查询。-- 子查询 SELECT * FROM table_name WHERE col1 IN (SELECT col1 FROM other_table);-- 改为 JOIN SELECT t1.* FROM table_name t1 JOIN other_table t2 ON t1.col1 = t2.col1; -
合理使用 LIMIT:
对分页查询,尽量使用LIMIT + 游标(id > n)的方法,减少使用LIMIT + OFFSET的方式,尤其是当 偏移量(OFFSET)非常大时。LIMIT + OFFSET的性能瓶颈:- 数据库需要从头开始扫描,跳过
OFFSET指定的记录。 - 偏移量越大,查询耗时越长。
- 即使只返回少量数据,数据库仍需加载并跳过大量无关记录。
示例:-- 查询第 1000000 页,每页 10 条记录 SELECT * FROM orders ORDER BY id DESC LIMIT 1000000, 10;- 数据库会先找到前 1000000 条记录,跳过它们,然后再返回第 1000000 条后的 10 条记录。
- 随着 OFFSET 增大,性能会急剧下降。
优化方案:使用
LIMIT + 游标(id > n):-
通过游标条件
id > n,可以直接定位到需要的记录,避免跳过大量无关记录。示例:
假设表orders中的主键是id,查询从第 1000000 条开始的 10 条记录:-- 优化后的查询 SELECT * FROM orders WHERE id > 1000000 ORDER BY id ASC LIMIT 10;- 通过
id > 1000000确定游标位置,直接从符合条件的记录开始扫描。 - 查询性能与
OFFSET无关,扫描范围大大缩小。
- 通过
- 数据库需要从头开始扫描,跳过
-
避免函数操作:
不要在WHERE子句中对列使用函数,会导致索引失效。SELECT * FROM table_name WHERE DATE(column_name) = '2023-01-01'; -- 慢SELECT * FROM table_name WHERE column_name >= '2023-01-01' AND column_name < '2023-01-02'; -- 快 -
减少
OR的使用:
OR通常会导致全表扫描,可以用UNION或IN代替。-- 原始查询:使用 OR,可能导致全表扫描 SELECT * FROM table_name WHERE col1 = 1 OR col1 = 2;-- 优化方式 1:使用 IN,能够高效利用单列索引 SELECT * FROM table_name WHERE col1 IN (1, 2);-- 优化方式 2:使用 UNION,将查询拆分成两个独立的部分 (SELECT * FROM table_name WHERE col1 = 1) UNION (SELECT * FROM table_name WHERE col1 = 2); -
优化
LIKE查询:
LIKE查询如果以%开头会导致全表扫描,因为无法使用索引。可以优化为前缀匹配或使用全文索引。示例:
-- 非优化:前缀为 %,无法使用索引 SELECT * FROM table_name WHERE col1 LIKE '%keyword%';-- 优化:前缀匹配,能够使用索引 SELECT * FROM table_name WHERE col1 LIKE 'keyword%';-- 使用全文索引(适用于大文本字段) ALTER TABLE table_name ADD FULLTEXT(col1); SELECT * FROM table_name WHERE MATCH(col1) AGAINST('keyword');
4. 分库分表
分库分表是一种应对大规模数据存储和高并发访问的解决方案。
-
何时分库分表:
根据《阿里巴巴 Java 开发手册》的建议,单表行数超过 500 万行或单表容量超过 2GB 时,考虑分库分表。 -
分库分表的好处:
- 提升查询效率:通过拆分单表或数据库,将数据分散到多个存储节点上,减少单节点的存储和查询压力。
- 提升并发性能:多个节点可以同时处理查询或写入操作,分担压力。
- 减少锁冲突:分库分表后,每个表的并发操作减少,减少锁等待和冲突。
-
分库分表的方式:
-
垂直拆分(按功能分库):
按业务模块划分数据库,将不同的业务表存储在不同的库中。库1:用户数据(users, profiles) 库2:订单数据(orders, order_items) 库3:商品数据(products, categories) -
水平拆分(按数据分片分库分表):
将单表数据按照一定规则(如用户 ID、订单 ID 等)拆分到多个表或库中。- 范围分片:根据 ID 范围分配数据。
orders_0: ID 1-10000 orders_1: ID 10001-20000 - 哈希分片:对分片键取模,将数据分散到多个库或表中。
-- 按订单 ID 取模分表 SELECT * FROM orders_hash WHERE MOD(order_id, 4) = 0;
- 范围分片:根据 ID 范围分配数据。
-
-
分库分表的注意事项:
- 尽量在当前架构下优化数据库性能,例如升级硬件、迁移历史数据。
- 分片键的选择要能有效分散数据,同时能支持大部分查询需求。
- 使用分布式中间件(如 ShardingSphere、MyCAT)来管理分库分表后的复杂性。
慢查询日志的适用场景
- 数据库性能调优
- 找出执行较慢的查询,优化索引设计或SQL语句。
- 排查系统瓶颈
- 通过
log_queries_not_using_indexes找出未使用索引的查询,优化数据访问路径。
- 通过
- 数据模型优化
- 分析慢查询日志,可以评估表设计、字段类型是否合理。
慢查询日志的优缺点
-
优点:
- 帮助识别性能瓶颈。
- 提供查询优化的方向。
- 支持将日志存储为表,便于后续分析。
-
缺点:
- 开启后可能对性能产生一定影响,尤其是高并发场景。
- 日志文件可能过大,需要定期清理。
总结
慢查询日志是性能调优的重要工具,通过合理的日志配置和日志分析,可以有效发现并优化SQL查询性能问题。然而,在高并发环境下,应根据需求合理开启并定期清理日志,避免对数据库性能造成额外负担。
相关文章:
MySQL数据库——常见慢查询优化方式
本文详细介绍MySQL的慢查询相关概念,分析步骤及其优化方案等。 文章目录 什么是慢查询日志?慢查询日志的相关参数如何启用慢查询日志?方式一:修改配置文件方式二:通过命令动态启用 分析慢查询日志方式一:直…...
【AIGC篇】AIGC 引擎:点燃创作自动化的未来之火
:羑悻的小杀马特.-CSDN博客 未来都是惊喜。你生来本应为高山。并非草芥。 引言: 在当今数字化的时代,人工智能生成内容(AIGC)正以一种前所未有的力量改变着我们的创作领域。它就像一个神秘而强大的魔法师,…...
C语言性能优化:从基础到高级的全面指南
引言 C 语言以其高效、灵活和功能强大而著称,被广泛应用于系统编程、嵌入式开发、游戏开发等领域。然而,要写出高性能的 C 语言代码,需要对 C 语言的特性和底层硬件有深入的了解。本文将详细介绍 C 语言性能优化的背后技术,并通过…...
常用的公共 NTP(网络时间协议)服务器
公共 NTP 服务列表 以下是一些常用的公共 NTP(网络时间协议)服务器,供您参考: 中国地区公共 NTP 服务器 国家授时中心 NTP 服务器:ntp.ntsc.ac.cn中国 NTP 快速授时服务:cn.ntp.org.cn阿里云公共 NTP 服务…...
Kafka中的Topic和Partition有什么关系?
大家好,我是锋哥。今天分享关于【Kafka中的Topic和Partition有什么关系?】面试题。希望对大家有帮助; Kafka中的Topic和Partition有什么关系? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Apache Kafka 中&#…...
Unity 使用UGUI制作卷轴开启关闭效果
视频效果 代码 using UnityEngine.UI; using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; using DG.Tweening.Core; using DG.Tweening.Plugins.Options;public class JuanZhou : MonoBehaviour {[SerializeField]private …...
MarkDown怎么转pdf;Mark Text怎么使用;
MarkDown怎么转pdf 目录 MarkDown怎么转pdf先用CSDN进行编辑,能双向看版式;标题最后直接导出pdfMark Text怎么使用一、界面介绍二、基本操作三、视图模式四、其他功能先用CSDN进行编辑,能双向看版式; 标题最后直接导出pdf Mark Text怎么使用 Mark Text是一款简洁的开源Mar…...
整合版canal ha搭建--基于1.1.4版本
开启MySql Binlog(1)修改MySql配置文件(2)重启MySql服务,查看配置是否生效(3)配置起效果后,创建canal用户,并赋予权限安装canal-admin(1)解压 canal.admin-1…...
QGIS移动图元功能
有时需要在QGIS里面移动一些矢量图层,比如图层的地理配准,网上搜了一些资料没有查看,后来仔细找了下,在编辑-编辑几何图形-移动要素里面,可以移动图层。 注意:移动前先要选择上要移动的图层,之…...
【模电刷题复习--填空】
如有错误,欢迎各位大佬在评论区批评指正 模电刷题 一、填空题1.本征半导体中,若掺入微量的__五__价元素,则形成___n___型半导体,其多数载流子是自由电子,若掺入微量的__三__价元素,则形成__p__型半导体。其…...
shardingsphere-jdbc-core-spring-boot-starter的性能问题(理论)
hardingSphere-JDBC-core-spring-boot-starter 是 ShardingSphere 提供的与 Spring Boot 集成的模块,用于实现数据库的分库分表等功能。在性能方面,它既有优势也存在一定的挑战,以下是具体分析: 优势方面 数据分片提升查询性能 通…...
Java Map 集合详解:基础用法、常见实现类与高频面试题解析
在 Java 集合框架中,Map 是用于存储键值对(Key-Value)的重要接口,广泛应用于开发中的各种场景。本文将详细讲解 Map 的基础概念、常见实现类及其特性,并结合代码示例和高频面试问题,帮助你深入理解 Map 的用…...
一款基于.Net方便、快捷的数据库文档查询、生成工具
项目介绍 SmartSQL 是一款方便、快捷的数据库文档查询、导出工具!从最初仅支持SqlServer数据库、CHM文档格式开始,通过不断地探索开发、集思广益和不断改进,又陆续支持Word、Excel、PDF、Html、Xml、Json、MarkDown等文档格式的导出。同时又…...
Linux平台下实现的小程序-进度条
目录 1.换行、回车概念 2.缓冲区 2.1缓冲区 2.2强制刷新 3.进度条程序 Makefile文件 ProgressBar.h ProgressBar.c Main.c 执行结果 1.换行、回车概念 /n:换行回车(\r:回车) 2.缓冲区 如下图在vim编辑器中的命令模式下…...
Ubuntu 22.04.5 修改IP
Ubuntu22.04.5使用的是netplan管理网络,因此需要在文件夹/etc/netplan下的01-network-manager-all.yaml中修改,需要权限,使用sudo vim或者其他编辑器,修改后的内容如下: # Let NetworkManager manage all devices on …...
解决virtualbox出现开启DHCP之后ubuntu虚拟机之后IP重复的问题
找遍了国内论坛,没一个能解决该问题的,所以我自己写个文章吧,真讨厌那些只会搬运的,污染国内论坛环境,搜一个问题,千篇一律。 问题 操作系统版本为"Ubuntu 24.04 LTS" lennytest1:~$ cat /etc…...
Java开发工具-Jar命令
Java开发工具-Jar 1、jar命令全平台使用 2、jar命令的作用 为类和资源创建存档,并从存档中操作或恢复单个类或资源 3、摘要 jar [OPTION …] [ [–release VERSION] [-C dir] files] … 4、jar命令描述 jar命令通常作为用于压缩与解压的工具,基于ZIP或Z…...
UE5通过蓝图节点控制材质参数
通过蓝图节点控制材质的参数 蓝图节点 在材质上设置标量值 和 在材质上设置向量参数值 Set Scalar Parameter Value on Materials Set Vector Parameter Value on Materials 这两个蓝图节点都可以在蓝图中,控制材质的参数值和向量值...
敖行客年终总结-AT Work 1.0发布
2024年就要过去了,看看敖行客这一年都干了些啥? 敖行客团队通过整整一年的努力,正式推出了AT Work 1.0订阅版,这也标志着AT Work即将正式和C端的小伙伴见面了。 AT Work 是什么? 长期以来,软件研发成本、…...
线程锁和协程锁的区别
转自:chatgpt 1.bthread_mutex_t bthread_mutex_t 是 brpc 框架提供的一种互斥锁,专门为 bthread(轻量级线程) 设计,具有以下特点: 适用于 bthread 调度模型: bthread_mutex_t 是为 brpc 中的…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
