网站首页 > 技术文章 正文
一、收集并识别慢SQL
方法:
- 使用数据库提供的慢查询日志功能
- 在应用程序中添加sql执行时间日志
- 使用APM(应用性能管理)工具监控(如New Relic,Dynatrace)
示例:开启MySql慢查询日志
SET GLOBAL slow_query_log = 'ON'; #打开mysql监控查询日志
SET GLOBAL long_query_time = 2; #设置慢查询阀值为2秒
二、对慢 SQL 语句展开分析
抓取SQL:
- 从慢查询日志或应用日志中提取出慢SQL语句
- 收集执行计划和执行时间
示例:抓取到的慢sql
SELECT
t1.id,
t1.date,
t2.address
FROM orders AS t1
LEFT JOIN customers AS t2 ON t1.id = t2.id
WHERE t1.add_time BETWEEN '2023-03-05' AND '2024-10-23'
ORDER BY t1.date DESC;
三、收集SQL执行计划
获取慢SQL的执行计划以了解数据库如何执行查询。
分析工具:
- MySQL:使用 EXPLAIN 命令
- Oracle:使用AUTOTRACE或DBMS_XPLAN
- Postgres:使用EXPLAIN ANALYZE
示例执行计划:
EXPLAIN SELECT
t1.id,
t1.date,
t2.address
FROM orders AS t1
LEFT JOIN customers AS t2 ON t1.id = t2.id
WHERE t1.add_time BETWEEN '2023-03-05' AND '2024-10-23'
ORDER BY t1.date DESC;
执行计划会显示表扫描类型(如全表扫描、索引扫描),以及各个操作的数量、时间和可能的改进点。
四、检查表和索引
- 确认索引使用情况:确定慢SQL查询的过滤条件和连接条件是否已正确索引
- 统计信息:确保数据库拥有最新的统计信息,以优化查询计划
- 检查数据量:了解涉及表的数据量,以评估查询复杂性。
索引创建示例:
CREATE INDEX idx_order_date ON orders(date);
CREATE INDEX idx_customer_id ON orders(id);
五、优化SQL设计
- 重构复杂查询:拆分复杂的多表查询,分阶段进行
- 减少返回数据量:仅查询必要的数据列,避免使用SELECT *
- 使用合适的聚合:如果使用聚合函数,确保有效使用索引,避免全表扫描。
优化后的sql:示例展示,主要用于表明sql被优化了
SELECT t.id,
t1.date,
t2.address
FROM ( SELECT
t1.id,
t1.date,
t2.address
FROM orders AS t1 WHERE t1.add_time BETWEEN '2023-03-05' AND '2024-10-23' ) AS t
LEFT JOIN customers AS t2 ON tt.id = t2.id
ORDER BY t.date DESC;
优化完的sql,需要再次通过EXPLAIN检查
六、配置和硬件观察
- 数据库参数:调整内存缓存参数,连接池配置等以提升性能。
- 硬件资源:检查CPU和内存使用是否是瓶颈。
- 负载分布:了解负载峰值时间并进行优化(如数据分片、分区)
七、验证和实现优化
- 数据库性能测试:进行负载测试以验证优化效果。
- 监控持续执行情况:持续观察SQL的执行性能,确保性能提升。
总结:
通过系统化的步骤,快速识别并优化慢SQL,不仅提升了应用响应速度,同时改善了用户体验。每个步骤都有助于从不同角度发现潜在问题,并通过合适的方法进行解决。这样的流程在不同类型的数据库上可以适当调整,但核心原则是一致的。
猜你喜欢
- 2024-11-10 「大数据」关于数据入湖之后,Hive查询会产生延迟的记录
- 2024-11-10 蓝易云 - oracle dblink mysql查询text无法显示问题
- 2024-11-10 减少I/O读取提高Oracle运行效率 oracle提高delete效率
- 2024-11-10 美团面试题:慢SQL有遇到过吗?是怎么解决的?
- 2024-11-10 如何定位慢的SQL sql定位查询
- 2024-11-10 无需改代码,提高SQL SERVER数据库性能的10个最简单方法
- 2024-11-10 MyBatis框架 - MyBatis Plus 解决大数据量查询慢问题
- 2024-11-10 数据查询慢?软硬结合加速查询,让效率飙升!
- 2024-11-10 怎么查看sql慢查询 怎么排查sql查询速度缓慢的问题
- 2024-11-10 远程查询CLOB字段导致查询慢 远程查询clob字段导致查询慢吗
你 发表评论:
欢迎- 615℃几个Oracle空值处理函数 oracle处理null值的函数
- 608℃Oracle分析函数之Lag和Lead()使用
- 595℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 592℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 587℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 580℃【数据统计分析】详解Oracle分组函数之CUBE
- 569℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 560℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- PageHelper - 最方便的 MyBatis 分页插件
- 面试二:pagehelper是怎么实现分页的,
- MyBatis如何实现分页查询?(mybatis-plus分页查询)
- SpringBoot 各种分页查询方式详解(全网最全)
- 如何在Linux上运行exe文件,怎么用linux运行windows软件
- 快速了解hive(快速了解美国50个州)
- Python 中的 pyodbc 库(pydbclib)
- Linux搭建Weblogic集群(linux weblogic部署项目步骤)
- 「DM专栏」DMDSC共享集群之部署(一)——共享存储配置
- 故障分析 | MySQL 派生表优化(mysql pipe)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)