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

image

实验2

image

实验3

image

实验4

image

梦葉樱 all right reserved,powered by Gitbook该文件最后修改时间: 2025-07-22 15:33:52

results matching ""

    No results matching ""