一、识别慢 SQL

1. 启用慢查询日志

-- 查看当前慢查询配置
SHOW VARIABLES LIKE 'slow_query%';
SHOW VARIABLES LIKE 'long_query_time';-- 开启慢查询日志(临时生效)
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;  -- 设置慢查询阈值(秒)
SET GLOBAL slow_query_log_file = '/var/lib/mysql/slow.log';-- 记录未使用索引的查询
SET GLOBAL log_queries_not_using_indexes = 'ON';-- 永久生效需修改 my.cnf
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/lib/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = 1
查看慢查询日志内容:使用系统命令查看日志文件(Linux)

假设你的日志文件在 /var/lib/mysql/slow.log,可以直接用 tailcatless 查看:

tail -f /var/lib/mysql/slow.log   # 实时查看新增的日志
cat /var/lib/mysql/slow.log       # 查看全部内容
less /var/lib/mysql/slow.log      # 分页查看

示例日志格式如下:

# Time: 2025-06-20T17:30:45.123456Z
# User@Host: root[root] @ localhost []
# Query_time: 3.123456  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 1000000
SET timestamp=1750486245;
SELECT * FROM users WHERE username = 'test';
  • Query_time: 查询耗时(秒),超过 long_query_time 才会被记录。
  • Rows_examined: 扫描行数,越大越可能需要优化。
  • SQL语句: 实际执行的 SQL。

2. 使用性能分析工具

-- 查看当前运行中的慢查询
SHOW FULL PROCESSLIST;-- 使用 EXPLAIN 分析执行计划
EXPLAIN SELECT * FROM orders WHERE customer_id = 1000;-- 使用 EXPLAIN ANALYZE(MySQL 8.0+)
EXPLAIN ANALYZE SELECT * FROM products WHERE price > 100;-- 性能分析(临时启用)
SET profiling = 1;
SELECT * FROM large_table;
SHOW PROFILES;
SHOW PROFILE FOR QUERY 1;

3.使用 EXPLAIN 分析 SQL 执行计划的详细指南

基础用法(直接在 SQL 前加 EXPLAIN
EXPLAIN SELECT * 
FROM orders 
WHERE user_id = 100 AND status = 'completed' 
ORDER BY created_at DESC 
LIMIT 10;

输出结果示例及关键列解析:

idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
1SIMPLEordersNULLrefidx_user_ididx_user4const50010.00Using where; Using filesort

核心列深度解析:
  1. type(访问类型) - 最重要指标

    • 性能排序:system > const > eq_ref > ref > range > index > ALL

    • 优化目标:至少达到 range 级别,避免 ALL(全表扫描)

    • 示例诊断:ref 表示使用了非唯一索引                                                           

  2. key(实际使用索引)

    • 检查是否使用预期索引:idx_user(实际使用) vs idx_user_status(可能更好的索引)

    • 若为 NULL 表示未使用索引 → 需优化

  3. rows(扫描行数)

    • 预估扫描 500 行 → 结合 filtered 列,实际返回约 500 × 10% = 50 行

    • 目标:减少该值

  4. Extra(额外信息) - 问题高发区

    • Using filesort:手动文件排序(需优化)

    • Using temporary:创建临时表(需优化)

    • Using index:覆盖索引(好现象)

    • Using where:存储引擎返回后再次过滤

类型 (type)性能排序含义描述典型场景扫描方式扫描行数是否用索引优化建议
system★★★★★ 最佳系统表/仅有一行记录• MyISAM/Inemory引擎的单行系统表
• 衍生表只有一行数据
直接访问系统记录1无需优化
const★★★★☆ 极优主键/唯一索引的单行访问• WHERE id = 1 (主键查询)
• WHERE unique_col = 'value' (唯一索引)
常量扫描
直接定位单行
1确保主键/唯一索引有效
eq_ref★★★★☆ 极优主键关联查询
(多表JOIN时)
• JOIN ... ON t1.primary_key = t2.primary_key
• 驱动表每行匹配被驱动表主键
唯一索引扫描
每行只匹配一次
1/N
(N=驱动表行数)
确保JOIN字段是主键或唯一索引
ref★★★☆☆ 良好非唯一索引的等值查询• WHERE index_col = 'value'
• 普通索引关联查询
• 最左前缀匹配查询
索引范围扫描
可能返回多行
N
(匹配行数)
提升索引选择性
添加组合索引
range★★☆☆☆ 中等索引范围扫描• WHERE id > 100
• BETWEEN 100 AND 200
• IN (1,2,3)
• LIKE 'prefix%'
索引部分扫描
指定范围内遍历
M
(范围行数)
控制扫描行数<1万
避免大范围扫描
index★☆☆☆☆ 较差全索引扫描• SELECT indexed_col FROM table (覆盖索引)
• ORDER BY indexed_col (无WHERE条件)
• 索引全扫描
遍历整个索引树
不读数据文件
全索引
(索引条目数)
确认是否需回表
检查排序必要性
ALL⚠️ 最差全表扫描• 无索引字段查询:WHERE non_index_col=...
• 前导通配符:LIKE '%value%'
• 未优化的JOIN条件
逐行扫描数据文件
性能灾难
全表
(数据行数)
紧急优化!
• 添加索引
• 重写SQL
• 限制结果集

 通过 EXPLAIN 分析后,若出现 ALL 或 index 且扫描行数>1000,需优化

  1. 优先关注 type 避免全表扫描

  2. 重点检查 Extra 消除警告项

  3. 通过 rows 评估执行成本

  4. 结合 key_len 判断索引利用率

  5. 每次优化后必须重新执行 EXPLAIN 验证效果

二、慢 SQL 的常见原因

1. 索引问题

-- 缺失索引
SELECT * FROM users WHERE last_name = 'Smith'; -- 无索引-- 索引失效
SELECT * FROM orders WHERE YEAR(order_date) = 2023; -- 函数导致索引失效

2. 全表扫描

-- 未使用索引导致全表扫描
SELECT * FROM products WHERE category LIKE '%electronics%';

3. 复杂 JOIN

-- 多表 JOIN 未优化
SELECT * 
FROM orders o
JOIN customers c ON o.customer_id = c.id
JOIN products p ON o.product_id = p.id
WHERE c.country = 'USA' AND p.price > 100;

4. 大表分页

-- 低效的分页查询
SELECT * FROM logs ORDER BY id LIMIT 1000000, 20;

5.低效子查询

-- 低效的子查询
SELECT * FROM orders 
WHERE customer_id IN (SELECT id FROM customers WHERE country = 'China'
);

 三、慢 SQL 优化方案

1. 索引优化策略

-- 添加必要索引
CREATE INDEX idx_last_name ON users(last_name);
CREATE INDEX idx_order_date ON orders(order_date);-- 使用覆盖索引
SELECT customer_id, order_date FROM orders; -- 建立 (customer_id, order_date) 索引-- 索引合并优化
SELECT * FROM products 
WHERE category_id = 5 OR price > 100; -- 分别建立两个索引-- 强制索引使用
SELECT * FROM orders FORCE INDEX (idx_order_date) 
WHERE order_date BETWEEN '2023-01-01' AND '2023-01-31';

2. SQL 重写

-- 避免 SELECT * 
SELECT id, name, email FROM users;-- 分页优化
SELECT * FROM logs WHERE id > 1000000 ORDER BY id LIMIT 20;-- JOIN 优化
SELECT o.id, c.name, p.product_name 
FROM orders o
FORCE INDEX (idx_customer) 
JOIN customers c ON o.customer_id = c.id
JOIN products p ON o.product_id = p.id
WHERE c.country = 'USA';-- 子查询转 JOIN
SELECT o.* 
FROM orders o
JOIN customers c ON o.customer_id = c.id
WHERE c.country = 'China';-- 避免函数操作
SELECT * FROM orders 
WHERE order_date >= '2023-01-01' 
AND order_date < '2023-02-01';

3. 表结构优化

数据库分库分表:垂直拆分/水平拆分

4. 架构级优化

  • 读写分离:写操作到主库,读操作到从库

  • 缓存层:使用 Redis 缓存热点数据

  • 搜索引擎:复杂查询使用 Elasticsearch

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/85800.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/85800.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/85800.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

墨记APP:水墨风记事,书写生活诗意

在快节奏的现代生活中&#xff0c;记录生活的点滴成为了一种独特的仪式感。无论是日常的琐事、突发的灵感&#xff0c;还是对未来的规划&#xff0c;一款好用的记事软件都能帮助我们更好地整理思绪&#xff0c;留住美好瞬间。墨记APP正是一款兼具美学与实用性的记事软件&#x…

龙芯7A1000桥片数据手册解读(时序)

RTC是电池&#xff0c;理论上一直是有电的&#xff0c;图示指的是接上220V电之后切换为系统的电。顺序是这样的&#xff1a;接上220V电之后系统的12V供电就有了&#xff0c;12V转为5VSB&#xff0c;5VSB供给RTC3V&#xff0c;此时RTC3V转为系统供电而不是电池供电。这里的5VSB指…

无人机气压计模块技术解析

一、运行方式 1. 基础原理 气压计通过测量大气压力间接计算高度。无人机飞行中&#xff0c;气压随高度上升而降低&#xff0c;传感器将压力信号转为电信号&#xff0c;经ADC转换为数字值。 2. 工作流程 数据采集&#xff1a;同步获取压力与温度值。 原始数据处理&…

第十四节:第三部分:IO流:前置知识-什么是方法递归以及递归的形式、递归算法三要素

什么是方法递归以及递归的形式 递归算法三要素 代码 代码一&#xff1a;认识一下递归的形式 package com.itheima.Recurtion; //目标:认识一下递归的形式 public class RecurtionTest1 {public static void main(String[] args) {test2();}//直接方法递归public static void…

论文阅读笔记:Digging Into Self-Supervised Monocular Depth Estimation

论文阅读笔记&#xff1a;Digging Into Self-Supervised Monocular Depth Estimation 1 背景2 创新点3 方法4 模块4.1 自监督训练4.2 优化自监督深度估计4.2.1 每个像素的最小重建损失4.2.2 自动掩码静态像素4.2.3 多尺度估计4.2.4 最终的训练损失 4.3 额外考虑 5 效果 1 背景 …

YAML 数据格式详解

1. YAML 概念 YAML (YAML Ain’t Markup Language) 是一种人性化的数据序列化格式&#xff1a; 专注于数据而非标记&#xff08;与 XML 不同&#xff09;使用简洁的语法表示复杂数据结构可读性高&#xff0c;适合人类编写和阅读广泛应用于配置文件&#xff08;如 Docker Comp…

react扩展

首先补充一下上个章节的一点结尾内容。reducer是一个纯函数&#xff0c;纯函数指的是当我们在redux里面定义了我们需要共享的对象后&#xff0c;我们是不可以对共享的对象本身进行改变的。我们在获取更新后的共享数据时&#xff0c;要去重新定义一个新的变量来获取更新后的共享…

6.获取图片灰度与缩放

目录 一、Halcon 1. 获取像素坐标以及灰度 2. 拖动缩放 3.图像缩放的实现方式 二、VS联合编程 1.获取像素坐标和灰度 2.拖动缩放 一、Halcon 1. 获取像素坐标以及灰度 *1. 获取像素坐标 * 1. get_mposition * 2. halcon窗口事件自带坐标数据 * *2. 获取像素灰度 *…

无人机+AI:革新集装箱箱号识别的智能解决方案

在现代化物流体系中&#xff0c;集装箱箱号识别是货物追踪与管理的核心环节。然而&#xff0c;传统的人工巡检或固定摄像头识别方式存在效率低、覆盖范围有限、易受环境干扰等问题&#xff0c;难以满足日益增长的物流需求。基于无人机与AI技术的集装箱箱号识别系统&#xff0c;…

一种新的参数高效微调方法-LoRI

论文&#xff1a;LoRI: Reducing Cross-Task Interference in Multi-Task Low-Rank Adaptation LoRA 具体参考 1. 引言与背景&#xff1a;为什么需要 LoRI&#xff1f; 这篇论文提出了一种新的参数高效微调&#xff08;PEFT&#xff09;方法&#xff0c;名为 LoRA with Reduce…

Go网络编程:基于TCP的网络服务端与客户端

Go 语言的 net 包为网络编程提供了简洁高效的接口。我们可以使用它快速构建 TCP 网络服务&#xff0c;如聊天服务器、RPC、微服务通信等。 一、TCP简介 TCP&#xff08;Transmission Control Protocol&#xff09;是面向连接的、可靠的传输协议&#xff0c;通信模型为客户端-服…

【StarRocks系列】架构、核心概念

目录 一、架构&#xff1a;分布式 MPP 列式存储 向量化引擎 二、存储&#xff1a;高性能列式存储引擎 三、表设计&#xff1a;三类模型适配不同场景 四、数据写入&#xff1a;多种方式支持实时与批量 五、数据读取&#xff1a;极致优化的查询引擎 总结&#xff1a;Star…

从源码到生产:Apache 2.4.57 自动化安装实战指南(附脚本)

引言&#xff1a;为何选择源码安装 Apache&#xff1f; 在服务器运维场景中&#xff0c;源码编译安装 Apache HTTP Server 是实现精细化配置的重要方式。相比包管理器安装&#xff0c;源码安装可自定义模块组合、适配特定依赖环境&#xff0c;并精确控制版本。本文将通过自动化…

iOS开发中的安全实践:如何通过Ipa混淆与加固确保应用安全

随着移动应用技术的不断发展&#xff0c;开发者越来越重视应用的安全性&#xff0c;尤其是iOS应用。无论是面对大规模的数据泄露问题&#xff0c;还是在应用上线后避免被逆向破解&#xff0c;开发者们都需要采取一系列技术手段来保护应用。然而&#xff0c;很多开发者在应用开发…

JAVA实战开源项目:智慧生活商城系统 (Vue+SpringBoot) 附源码

本文项目编号 T 245 &#xff0c;文末自助获取源码 \color{red}{T245&#xff0c;文末自助获取源码} T245&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

GNU Octave 基础教程(8):GNU Octave 常用数学函数

目录 一、基本算术运 二、初等数学函数 三、三角函数与反三角函数 四、统计函数 五、复数与其他函数 ✅ 小结 &#x1f51c; 下一讲预告 GNU Octave 内置了大量数学函数&#xff0c;涵盖初等数学、线性代数、复数运算、统计函数等&#xff0c;非常适合科研、工程计算使用…

Go语言中的文件与IO:JSON、CSV、XML处理

在数据交换与存储中&#xff0c;JSON、CSV、XML 是常见格式。Go 标准库为这些格式提供了强大且易用的支持&#xff0c;涵盖结构体映射、读写文件、编码解码等操作。 一、JSON处理&#xff08;encoding/json&#xff09; 1. 基本使用&#xff1a;结构体 <-> JSON type U…

三种语言写 MCP

参考 https://zhuanlan.zhihu.com/p/1915029704936760261 https://www.5ee.net/archives/tmXJAgWz https://github.com/modelcontextprotocol/python-sdk https://github.com/modelcontextprotocol/typescript-sdk https://modelcontextprotocol.io/quickstart/server https:/…

Python训练营-Day38-Dataset和Dataloader类

在遇到大规模数据集时&#xff0c;显存常常无法一次性存储所有数据&#xff0c;所以需要使用分批训练的方法。为此&#xff0c;PyTorch提供了DataLoader类&#xff0c;该类可以自动将数据集切分为多个批次batch&#xff0c;并支持多线程加载数据。此外&#xff0c;还存在Datase…

SVN上传代码

SVN&#xff08;Subversion&#xff09;是一个常用的版本控制系统&#xff0c;提供了对代码管理和协作的支持。以下是SVN常见操作&#xff08;如获取代码、上传代码、合并冲突处理等&#xff09;的命令行流程及实例&#xff1a; 1. 获取代码&#xff08;Checkout&#xff09; 在…