目录

慢SQL日志分析与诊断

开启慢查询日志

慢查询日志分析工具

慢SQL优化策略

1. 避免SELECT * 查询

2. 创建高效索引

索引选择原则

索引使用注意事项

3. 使用EXPLAIN分析执行计划

4. 优化排序操作

5. 解决深分页问题

6. 避免全表扫描

7. 优化JOIN操作

8. 合理使用子查询

高级优化技巧

1. 使用覆盖索引

2. 索引条件下推(ICP)

3. 使用批处理减少交互

4. 合理使用临时表

名词解释

总结


慢SQL日志分析与诊断

开启慢查询日志

-- 开启慢查询日志功能
SET GLOBAL slow_query_log = 'ON';-- 设置慢SQL时间阈值(单位:秒),超过此时间的查询会被记录
SET GLOBAL long_query_time = 5;-- 查看慢查询日志文件位置
SHOW GLOBAL VARIABLES LIKE 'slow_query_log_file';-- 使用mysqldumpslow工具分析慢查询日志
-- 常用参数:-s排序方式(t按时间,c按次数),-t显示前N条
-- 示例:mysqldumpslow -s t -t 10 /var/logs/mysql/slow.log

慢查询日志分析工具

除了mysqldumpslow,还可以使用:

  1. ​pt-query-digest​​(Percona Toolkit的一部分):更强大的日志分析工具

    pt-query-digest /var/logs/mysql/slow.log
  2. ​MySQL Workbench​​:图形化界面分析工具

慢SQL优化策略

1. 避免SELECT * 查询

-- 不推荐
SELECT * FROM users WHERE id = 1;-- 推荐:只查询需要的列
SELECT id, username, email FROM users WHERE id = 1;

​原因​​:

  • 增加网络I/O负担
  • 当表中有大字段(如TEXT/BLOB)时性能影响显著
  • 可能使覆盖索引失效(后面会解释)

2. 创建高效索引

索引选择原则
  • ​高区分度​​:选择区分度高的列建索引(如用户ID比性别更适合)
  • ​常用查询条件​​:为WHERE、JOIN、ORDER BY、GROUP BY中的列建索引
  • ​短字段优先​​:整型字段比字符串字段更适合做索引
-- 创建单列索引
CREATE INDEX idx_username ON users(username);-- 创建复合索引
CREATE INDEX idx_status_created ON orders(status, created_at);
索引使用注意事项
  • ​最左匹配原则​​:复合索引必须从左到右使用

    -- 对于INDEX(a, b, c)
    WHERE a = 1 AND b = 2 -- 使用索引
    WHERE b = 2 AND c = 3 -- 不使用索引(缺少a)
    WHERE a = 1 AND c = 3 -- 部分使用索引(只用a)
  • ​避免索引失效​​:

    • 不要在索引列上使用函数:WHERE YEAR(create_time) = 2023
    • 避免隐式类型转换:WHERE user_id = '123'(user_id是整型)
    • 避免使用!=NOT INIS NULL等操作符

3. 使用EXPLAIN分析执行计划

EXPLAIN SELECT * FROM users WHERE username = 'john';

​关键指标解读​​:

  • ​type​​:访问类型(从好到差:system > const > eq_ref > ref > range > index > ALL)
  • ​possible_keys​​:可能使用的索引
  • ​key​​:实际使用的索引
  • ​rows​​:预估需要检查的行数
  • ​Extra​​:额外信息(如Using filesort、Using temporary表示性能问题)

4. 优化排序操作

-- 不推荐:大数据集文件排序
SELECT * FROM products ORDER BY price DESC LIMIT 100;-- 推荐:为排序字段添加索引
ALTER TABLE products ADD INDEX idx_price (price);
SELECT * FROM products ORDER BY price DESC LIMIT 100;

​原理​​:B+树索引本身是有序的,利用索引可以避免内存排序(Using filesort)

5. 解决深分页问题

​问题​​:LIMIT 10000, 20会先读取10020条记录,然后丢弃前10000条

​优化方案​​:

  1. ​使用覆盖索引+延迟关联​

    SELECT * FROM products JOIN (SELECT id FROM products WHERE category_id = 5 ORDER BY created_at DESC LIMIT 10000, 20
    ) AS tmp USING(id);
  2. ​记录上次查询位置​​(适用于有序数据)

    -- 第一页
    SELECT * FROM products ORDER BY id DESC LIMIT 20;-- 后续页(假设上一页最后一条记录的id是12345)
    SELECT * FROM products WHERE id < 12345 ORDER BY id DESC LIMIT 20;

6. 避免全表扫描

  • 为查询条件添加适当的索引
  • 避免在WHERE子句中对字段进行运算或使用函数
  • 使用合适的查询条件,避免过于宽泛的条件

7. 优化JOIN操作

  • 确保JOIN字段有索引
  • 小表驱动大表(MySQL优化器通常会自动处理)
  • 避免多表JOIN(超过3个表考虑反范式化设计)

8. 合理使用子查询

-- 不推荐:相关子查询
SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 1000
);-- 推荐:改用JOIN
SELECT DISTINCT u.* FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.amount > 1000;

高级优化技巧

1. 使用覆盖索引

​覆盖索引​​:查询的所有字段都包含在索引中,无需回表

-- 假设有INDEX(username, email)
SELECT username, email FROM users WHERE username = 'john';

​优势​​:减少I/O操作,提高查询速度

2. 索引条件下推(ICP)

MySQL 5.6+特性,将WHERE条件推到存储引擎层过滤

-- 假设有INDEX(a, b)
SELECT * FROM table WHERE a = 1 AND b LIKE '%test%';

3. 使用批处理减少交互

-- 不推荐
INSERT INTO users(name) VALUES ('a');
INSERT INTO users(name) VALUES ('b');-- 推荐
INSERT INTO users(name) VALUES ('a'), ('b');

4. 合理使用临时表

对于复杂查询,可以考虑使用临时表分步处理

CREATE TEMPORARY TABLE temp_orders
SELECT user_id, SUM(amount) AS total 
FROM orders 
GROUP BY user_id
HAVING total > 1000;SELECT u.* FROM users u
JOIN temp_orders t ON u.id = t.user_id;

名词解释

  1. ​B+树​​:MySQL索引的数据结构,特点是:

    • 所有数据都存储在叶子节点
    • 叶子节点通过指针连接,适合范围查询
    • 树的高度低,查询效率稳定
  2. ​回表​​:当使用非主键索引查询时,先通过索引找到主键,再通过主键索引查找完整数据的过程

  3. ​覆盖索引​​:查询的列都包含在索引中,无需回表

  4. ​最左匹配原则​​:复合索引必须从左到右使用,不能跳过前面的列

  5. ​深分页​​:当LIMIT offset很大时(如LIMIT 100000, 10),MySQL需要先读取offset+limit条记录,性能差

  6. ​Using filesort​​:表示MySQL需要进行额外的排序操作,通常是因为没有使用索引排序

  7. ​Using temporary​​:表示MySQL需要创建临时表来处理查询,常见于GROUP BY、ORDER BY等操作

总结

慢SQL优化是一个系统工程,需要:

  1. 通过慢查询日志定位问题SQL
  2. 使用EXPLAIN分析执行计划
  3. 针对性应用优化策略
  4. 持续监控优化效果

记住:索引不是越多越好,每个索引都会增加写操作的成本。好的数据库设计加上合理的索引策略,才能获得最佳性能。

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

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

相关文章

OPENPPP2 VMUX 技术探秘(高级指南)

&#x1f680; VMUX技术分析&#xff1a;OPENPPP2中的虚拟多路复用技术 &#x1f31f; 一、技术目标 &#x1f517; 连接多路复用 通过单个或多个物理链路&#xff0c;承载多个逻辑TCP连接。 &#x1f680; 高性能传输 支持数据包乱序重组实现动态流量控制&#xff08;拥塞检测…

Linux系统时间不对导致mysql初始化失败:Data Dictionary initialization failed.(数据字典版本验证失败)

文章目录 问题描述分析**问题原因分析****解决方案****1. 修正系统时间****2. 检查数据目录完整性****3. 重新初始化数据目录****4. 调整 MySQL 配置** **验证与后续步骤****注意事项** 其他说明 问题描述 mysql数据初始化失败&#xff0c;发现系统时间是1970年&#xff0c;我…

有趣的python程序Part1:如何根据记忆曲线使用python编写一个单词记忆默写程序

目录 前言 1. 数据管理模块 2. 记忆算法实现 3. 持久化存储 4. 用户界面实现 5.整合与测试 前言 此篇文章为“有趣的python程序”专栏的第一篇文章&#xff0c;本专栏致力于分享一些有趣的编程作品&#xff0c;如果能够使您产生兴趣&#xff0c;不妨来动手改编使之成为更好…

【案例】性能优化在持续集成与持续交付中的应用

【案例】性能优化在持续集成与持续交付中的应用 为了更好地理解性能优化在CI/CD流程中的实际应用&#xff0c;本节将结合一个典型案例&#xff0c;从代码提交到部署上线的完整流程中&#xff0c;讲解如何嵌入性能检测与自动化优化机制&#xff0c;并使用结构化流程图直观展示关…

P7 QT项目----会学天气预报(完结)

7.8 QMap 在 Qt 中&#xff0c;如果你想要将 JSON 数据解析到一个 QMap 中&#xff0c;你可以遍历 JSON 对象的所有键值对&#xff0c;并将它们添加到 QMap 里。这个方法特别适合于当你的 JSON 对象是一个简单的键值对集合时。以下是一个如何实现这一点的示例。 示例&#…

操作系统笔记(关于进程引入和状态的切换)

1.前言 今天下午结束了英语的四六级考试&#xff0c;终于是结束了&#xff0c;最近的这个考试太密集&#xff0c;周四的专业基础课考试&#xff0c;周五的这个线性代数的考试和这个周六的英语四六级考试&#xff0c;吧我都要烤焦了&#xff0c;最近也是疲于应对这个考试&#…

M1芯片macOS安装Xinference部署大模型

如果你看的是官方手册&#xff1a;安装 — Xinference 千万不要直接运行&#xff1a; pip install "xinference[all]" 会遇到几个问题&#xff1a; 1&#xff09;Python版本如果太新可能安装失败 2&#xff09;全量安装会失败 3&#xff09;未科学上网可能会time…

【ONNX量化实战】使用ONNX Runtime进行静态量化

目录 什么是量化量化实现的原理实战准备数据执行量化 验证量化结语 什么是量化 量化是一种常见的深度学习技术&#xff0c;其目的在于将原始的深度神经网络权重从高位原始位数被动态缩放至低位目标尾数。例如从FP32&#xff08;32位浮点&#xff09;量化值INT8&#xff08;8位…

【量子计算】格罗弗算法

文章目录 &#x1f50d; 一、算法原理与工作机制⚡ 二、性能优势&#xff1a;二次加速的体现&#x1f310; 三、应用场景⚠️ 四、局限性与挑战&#x1f52e; 五、未来展望&#x1f48e; 总结 格罗弗算法&#xff08;Grover’s algorithm&#xff09;是量子计算领域的核心算法之…

C++ 互斥量

在 C 中&#xff0c;互斥量&#xff08;std::mutex&#xff09;是一种用于多线程编程中保护共享资源的机制&#xff0c;防止多个线程同时访问某个资源&#xff0c;从而避免数据竞争&#xff08;data race&#xff09;和不一致的问题。 &#x1f512; 一、基础用法&#xff1a;s…

CSS Content符号编码大全

资源宝整理分享&#xff1a;​https://www.httple.net​ 前端开发中常用的特殊符号查询工具&#xff0c;包含Unicode编码和HTML实体编码&#xff0c;方便开发者快速查找和使用各种符号。支持基本形状、箭头、数学符号、货币符号等多种分类。 前端最常用符号 图标形状十进制十…

RPC常见问题回答

项目流程和架构设计 1.服务端的功能&#xff1a; 1.提供rpc调用对应的函数 2.完成服务注册 服务发现 上线/下线通知 3.提供主题的操作 (创建/删除/订阅/取消订阅) 消息的发布 2.服务的模块划分 1.网络通信模块 net 底层套用的moude库 2.应用层通信协议模块 1.序列化 反序列化数…

【JavaEE】(3) 多线程2

一、常见的锁策略 1、乐观锁和悲观锁 悲观锁&#xff1a;预测锁冲突的概率较高。在锁中加阻塞操作。乐观锁&#xff1a;预测锁冲突的概率较低。使用忙等/版本号等&#xff0c;不产生阻塞。 2、轻量级锁和重量级锁 重量级锁&#xff1a;加锁的开销较大&#xff0c;线程等待锁…

创客匠人服务体系解析:知识 IP 变现的全链路赋能模型

在知识服务行业深度转型期&#xff0c;创客匠人通过 “工具 陪跑 圈层” 的三维服务体系&#xff0c;构建了从 IP 定位到商业变现的完整赋能链条。这套经过 5 万 知识博主验证的模型&#xff0c;不仅解决了 “内容生产 - 流量获取 - 用户转化” 的实操难题&#xff0c;更推动…

国产ARM/RISCV与OpenHarmony物联网项目(六)SF1节点开发

一、终端节点功能设计 1. 功能说明 终端节点设计的是基于鸿蒙操作系统的 TCP 服务器程序&#xff0c;用于监测空气质量并提供远程控制功能。与之前的光照监测程序相比&#xff0c;这个程序使用 E53_SF1 模块&#xff08;烟雾 / 气体传感器&#xff09;&#xff0c;主要功能包…

Plotly图表全面使用指南 -- Displaying Figures in Python

文中内容仅限技术学习与代码实践参考&#xff0c;市场存在不确定性&#xff0c;技术分析需谨慎验证&#xff0c;不构成任何投资建议。 在 Python 中显示图形 使用 Plotly 的 Python 图形库显示图形。 显示图形 Plotly的Python图形库plotly.py提供了多种显示图形的选项和方法…

getx用法详细解析以及注意事项

源码地址 在 Flutter 中&#xff0c;Get 是来自 get 包的一个轻量级、功能强大的状态管理与路由框架&#xff0c;常用于&#xff1a; 状态管理路由管理依赖注入&#xff08;DI&#xff09;Snackbar / Dialog / BottomSheet 管理本地化&#xff08;多语言&#xff09; 下面是 …

深度学习:人工神经网络基础概念

本文目录&#xff1a; 一、什么是神经网络二、如何构建神经网络三、神经网络内部状态值和激活值 一、什么是神经网络 人工神经网络&#xff08;Artificial Neural Network&#xff0c; 简写为ANN&#xff09;也简称为神经网络&#xff08;NN&#xff09;&#xff0c;是一种模仿…

Unity2D 街机风太空射击游戏 学习记录 #12环射道具的引入

概述 这是一款基于Unity引擎开发的2D街机风太空射击游戏&#xff0c;笔者并不是游戏开发人&#xff0c;作者是siki学院的凉鞋老师。 笔者只是学习项目&#xff0c;记录学习&#xff0c;同时也想帮助他人更好的学习这个项目 作者会记录学习这一期用到的知识&#xff0c;和一些…

网站如何启用HTTPS访问?本地内网部署的https网站怎么在外网打开?

在互联网的世界里&#xff0c;数据安全已经成为了每个网站和用户都不得不面对的问题。近期&#xff0c;网络信息泄露事件频发&#xff0c;让越来越多的网站开始重视起用户数据的安全性&#xff0c;因此启用HTTPS访问成为了一个热门话题。作为一名网络安全专家&#xff0c;我希望…