MySQL数据库:慢查询分析与优化
注意:本操作在测试环境进行,建议备份数据库或者打快照再操作。
无索引慢查询实验
1. 启用慢查询日志
-- 开启慢查询日志
SET GLOBAL slow_query_log = 1;
-- 设置慢查询阈值(单位:秒)
SET GLOBAL long_query_time = 0.2;
-- 重要:设置后需要重新连接或刷新使设置生效
FLUSH VARIABLES;
-- 验证设置(注意long_query_time可能需重连才显示新值)
SHOW VARIABLES LIKE 'slow_query%';
SHOW VARIABLES LIKE 'long_query_time';
2. 设计3条典型慢SQL
索引
进行实验前,请先打好快照(更安全)或备份
实验开始前删除相关索引
删除所有相关索引
-- 删除可能影响慢查询的索引
ALTER TABLE pre_forum_post
DROP INDEX dateline,
DROP INDEX displayorder,
DROP INDEX first;
查询相关索引是否还存在
验证无索引状态
SHOW INDEX FROM pre_forum_post;
-- 应只保留fid和invisible索引(与实验无关)
实验开始后恢复删除的相关索引,或直接恢复快照(更安全)或备份
索引恢复方案
-- 重建被删除的索引
ALTER TABLE pre_forum_post
ADD INDEX dateline (dateline),
ADD INDEX displayorder (tid, invisible, dateline),
ADD INDEX first (tid, first);
实验1:根据作者查询
-- SQL语句
SELECT * FROM pre_forum_post
WHERE authorid = 11
ORDER BY dateline DESC;
-- EXPLAIN分析
EXPLAIN SELECT * FROM pre_forum_post
WHERE authorid = 11
ORDER BY dateline DESC;
实验2:统计某主题回复数
-- SQL语句
SELECT COUNT(*) FROM pre_forum_post
WHERE tid = 48 AND first = 0;
-- EXPLAIN分析
EXPLAIN SELECT COUNT(*) FROM pre_forum_post
WHERE tid = 48 AND first = 0;
实验3:模糊搜索标题查询
-- SQL语句
SELECT * FROM pre_forum_post
WHERE subject LIKE '%测试主题%'
ORDER BY dateline DESC;
-- EXPLAIN分析
EXPLAIN SELECT * FROM pre_forum_post
WHERE subject LIKE '%测试主题%'
ORDER BY dateline DESC;
实验4:根据版块ID查询
-- SQL语句
SELECT * FROM pre_forum_post
WHERE repid = 0
ORDER BY dateline DESC;
-- EXPLAIN分析
EXPLAIN SELECT * FROM pre_forum_post
WHERE repid = 0
ORDER BY dateline DESC;
3. 执行与记录结果
结果表示例
实验序列 | 实验任务名称 | 执行时间 | EXPLAIN rows |
---|---|---|---|
1 | 根据作者查询 | 0.28s | 484505 |
2 | 统计某主题回复数 | 0.12s | 484505 |
3 | 模糊搜索标题查询 | 1.43s | 484505 |
4 | 根据版块ID查询 | 1.44s | 484505 |
实验1
实验2
实验3
实验4