一、慢查询日志基础配置
慢查询日志是MySQL性能优化的核心工具,通过以下配置开启:
启用慢查询日志
SET GLOBAL slow_query_log = 'ON';
设置慢查询阈值(单位:秒)
SET GLOBAL long_query_time = 1;
指定日志文件路径
SET GLOBAL slow_query_log_file = '/var/log/mysql/mysql-slow.log';
记录未使用索引的查询
SET GLOBAL log_queries_not_using_indexes = 'ON';
建议生产环境设置long_query_time
为0.5-2秒,开发环境可设为0.1秒捕获更多潜在问题。
二、慢查询日志分析工具
1. mysqldumpslow工具
查看执行时间最长的10个查询
mysqldumpslow -s t -t 10 /var/log/mysql/mysql-slow.log
统计出现次数最多的慢查询
mysqldumpslow -s c -t 5 /var/log/mysql/mysql-slow.log
2. pt-query-digest工具
生成详细分析报告
pt-query-digest /var/log/mysql/mysql-slow.log > slow_report.txt
该工具提供查询响应时间分布、表扫描统计等高级分析维度。
三、7种典型慢查询优化方案
1. 缺失索引优化
通过EXPLAIN
分析发现全表扫描:
EXPLAIN SELECT FROM orders WHERE user_id = 1000;
-- 显示type: ALL表示全表扫描
-- 解决方案:添加索引
ALTER TABLE orders ADD INDEX idx_user_id (user_id);
2. 复杂JOIN优化
-- 优化前(多表JOIN)
SELECT FROM orders o
JOIN users u ON o.user_id = u.id
JOIN products p ON o.product_id = p.id
WHERE u.status = 'active';
-- 优化后(使用派生表减少JOIN量)
SELECT o. FROM orders o
JOIN (SELECT id FROM users WHERE status = 'active') u
ON o.user_id = u.id
3. 分页查询优化
-- 低效写法(偏移量大时性能差)
SELECT FROM orders ORDER BY id LIMIT 10000, 20;
-- 优化写法(使用游标分页)
SELECT FROM orders WHERE id > 10000 ORDER BY id LIMIT 20;
4. 大数据量IN查询优化
-- 低效写法(IN列表过长)
SELECT FROM products WHERE id IN (1,2,3,...,1000);
-- 优化方案:改用临时表
CREATE TEMPORARY TABLE temp_ids (id INT PRIMARY KEY);
INSERT INTO temp_ids VALUES (1),(2),...,(1000);
SELECT p. FROM products p JOIN temp_ids t ON p.id = t.id;
5. 函数导致索引失效
-- 索引失效写法
SELECT FROM orders WHERE DATE(create_time) = '2023-01-01';
-- 优化写法(使用范围查询)
SELECT FROM orders
WHERE create_time BETWEEN '2023-01-01 00:00:00' AND '2023-01-01 23:59:59';
6. OR条件优化
-- 低效OR查询
SELECT FROM users WHERE status = 'active' OR vip_level > 3;
-- 优化为UNION
SELECT FROM users WHERE status = 'active'
UNION
SELECT FROM users WHERE vip_level > 3;
7. 子查询优化
-- 低效子查询
SELECT FROM products
WHERE category_id IN (SELECT id FROM categories WHERE type = 'electronics');
-- 优化为JOIN
SELECT p. FROM products p
JOIN categories c ON p.category_id = c.id AND c.type = 'electronics';
四、持续监控与预防
- 使用
Performance Schema
监控高频查询 - 定期执行
ANALYZE TABLE
更新统计信息 - 配置
pt-index-usage
跟踪索引使用情况 - 建立SQL审核流程,避免低效查询进入生产环境
评论