MySQL 慢查询是指执行时间超过设定阈值的 SQL 语句,识别和优化慢查询是提升数据库性能的关键。以下是关于慢查询的配置、分析和优化方法:
首先需要配置 MySQL 记录慢查询,步骤如下:
登录 MySQL 后执行:
show variables like 'slow_query_log';
show variables like 'long_query_time';
show variables like 'slow_query_log_file';
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;
编辑 MySQL 配置文件(my.cnf 或 mysqld.cnf),添加以下内容:
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1 # 阈值,单位秒
log_queries_not_using_indexes = 1 # 记录未用索引的查询
log_output = FILE # 日志输出到文件(默认)
修改后重启 MySQL 服务生效。
慢查询日志格式示例:
# Time: 230920 10:00:00
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 2.500 Lock_time: 0.000 Rows_sent: 1000 Rows_examined: 1000000
SELECT * FROM orders WHERE create_time < '2023-01-01';
关键参数:
-
Query_time:执行时间(秒)
-
Lock_time:锁定时间
-
Rows_sent:返回行数
-
Rows_examined:扫描行数(越大越可能需要优化)
MySQL 自带的日志分析工具,可统计慢查询:
mysqldumpslow -s c -t 10 /var/log/mysql/mysql-slow.log
mysqldumpslow -s t -t 10 /var/log/mysql/mysql-slow.log
mysqldumpslow -g 'orders' /var/log/mysql/mysql-slow.log
参数说明:
-
-s c:按查询次数排序
-
-s t:按执行时间排序
-
-t 10:显示前 10 条
-
-g:正则匹配
-
pt-query-digest(Percona Toolkit):更强大的分析工具,支持按多种维度统计
-
MySQL Workbench:可视化分析慢查询
-
为查询条件的字段添加索引(如
WHERE、JOIN、ORDER BY后的字段)
CREATE INDEX idx_orders_create_time ON orders(create_time);
-
避免索引失效:
-
不在索引字段上做计算(如
WHERE YEAR(create_time) = 2023)
-
避免使用
NOT IN、!=、IS NULL等可能导致全表扫描的操作
-
避免
SELECT *,只查询需要的字段
-
拆分复杂查询为多个简单查询
-
用
JOIN代替子查询(MySQL 5.5 + 对 JOIN 优化更好)
-
限制返回行数(使用
LIMIT)
-
示例:
SELECT * FROM orders WHERE user_id = 123;
SELECT id, order_no FROM orders WHERE user_id = 123 LIMIT 10;
-
大表分表(水平 / 垂直分表,见前文分表内容)
-
优化字段类型(如用
INT代替BIGINT,VARCHAR(20)代替VARCHAR(255))
-
使用合适的存储引擎(InnoDB 适合事务,MyISAM 适合读多写少场景)
-
调整
innodb_buffer_pool_size(建议设为系统内存的 50%-70%)
-
增大
query_cache_size(适用于读多写少场景,MySQL 8.0 已移除)
-
优化连接数(
max_connections)
-
慢查询阈值设置要合理(一般设为 1-3 秒,根据业务场景调整)
-
避免在生产环境频繁开启
log_queries_not_using_indexes(可能产生大量日志)
-
定期分析慢查询日志(如每天 / 每周),及时发现性能问题
-
优化后需重新测试,确认查询性能提升
通过以上步骤,可以有效识别并解决 MySQL 慢查询问题,显著提升数据库响应速度和整体性能。