一、识别慢查询
查询或开启慢查询日志
-- 查看慢查询日志文件位置
SHOW VARIABLES LIKE 'slow_query_log_file';
-- 查看慢查询阈值(单位:秒)
SHOW VARIABLES LIKE 'long_query_time';
-- 查看是否记录未使用索引的查询
SHOW VARIABLES LIKE 'log_queries_not_using_indexes';
-- 查看慢查询日志输出格式(FILE/TABLE/NONE)
SHOW VARIABLES LIKE 'log_output';
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1; -- 设置慢查询阈值(秒)
SET GLOBAL log_queries_not_using_indexes = 'ON';
查看慢日志文件
分析慢查询
文件里详细记录了慢查询的sql语句。
使用Explain分析SQL执行计划
explain SELECT * from t_pretreatment_original_and_translation_20251 tp
LEFT JOIN t_pretreatment_original_and_translation_extend_20251 tpe on tp.id = tpe.original_and_translation_id
where tp.project_id ='D25012100800'
and tpe.original_plain_text like '%规范化的发挥';
二、常见优化策略
1. 索引优化
- 添加缺失索引
- 避免索引失效
- 不要在索引列上使用函数:
WHERE YEAR(create_time) = 2023
→WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31'
- 避免前导模糊查询:
LIKE '%abc'
→LIKE 'abc%'
- 注意隐式类型转换:
WHERE phone = 13800138000
→WHERE phone = '13800138000'
- 不要在索引列上使用函数:
2. SQL语句优化
- 避免SELECT *
- 优化JOIN操作
- 分页优化
-- 低效
SELECT * FROM orders LIMIT 1000000, 20;
-- 高效
SELECT * FROM orders WHERE id > 1000000 LIMIT 20;
3. 数据库设计优化
-
合理的数据类型
- 用INT代替VARCHAR存储ID
- 用TIMESTAMP代替VARCHAR存储时间
-
垂直拆分大表
-
引入ES等存储库