答案是通过开启慢查询日志、使用pt-query-digest分析日志、结合EXPLAIN执行计划优化索引和SQL语句,可系统性提升MySQL查询性能。

MySQL查询性能优化,说到底就是一场侦探游戏,而日志,尤其是慢查询日志,就是我们最重要的线索来源。它能直接指出哪些查询耗时过长、是性能瓶颈,然后我们才能有针对性地去分析和改进,而不是盲目地猜测。
要通过日志优化MySQL查询性能,核心在于“发现-分析-改进”的循环。我们首先需要开启并配置好慢查询日志,让MySQL自动记录下那些执行时间超过我们预设阈值的SQL语句。接着,利用日志分析工具对这些慢查询进行聚合和统计,找出其中最频繁、最耗时的“罪魁祸首”。一旦定位到具体的慢查询,我们就需要借助
EXPLAIN
EXPLAIN
开启和配置MySQL慢查询日志,其实并不复杂,但里面的“门道”却不少。我通常会在
my.cnf
my.ini
首先,你需要确保以下几行配置被正确添加或修改:
[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
这里面有几个关键点:
slow_query_log = 1
0
slow_query_log_file
/var/log/mysql/
long_query_time = 1
log_queries_not_using_indexes = 1
long_query_time
如果你不想重启MySQL服务,也可以通过SQL命令动态设置,但要注意,这种方式在服务重启后会失效:
SET GLOBAL slow_query_log = 'ON'; SET GLOBAL slow_query_log_file = '/var/log/mysql/mysql-slow.log'; SET GLOBAL long_query_time = 1; SET GLOBAL log_queries_not_using_indexes = 'ON';
配置完成后,别忘了检查日志文件是否正在生成,以及内容是否符合预期。这能避免你花时间去排查一个根本没开启日志的环境。
当慢查询日志开始记录数据后,直接打开一个巨大的日志文件去阅读,那简直是噩梦。原始的慢查询日志往往是密密麻麻的SQL语句,人工分析几乎不可能。这时候,我们就需要一些工具来帮助我们“消化”这些数据,从中提取出最有价值的信息。
我最常用的工具是Percona Toolkit中的
pt-query-digest
mysqldumpslow
使用
pt-query-digest
pt-query-digest /var/log/mysql/mysql-slow.log > slow_query_report.txt
运行后,它会生成一个详细的报告文件
slow_query_report.txt
从
pt-query-digest
pt-query-digest
通过这些聚合数据,我能够迅速定位到那些对系统性能影响最大的具体SQL语句。一旦定位,下一步就是针对这些具体的SQL语句,使用
EXPLAIN
EXPLAIN
定位到具体的慢查询后,
EXPLAIN
EXPLAIN
EXPLAIN
type
ALL
index
ALL
range
WHERE
>
<
BETWEEN
ref
eq_ref
JOIN
const
system
possible_keys
key
possible_keys
key
NULL
key_len
rows
Extra
Using filesort
Using temporary
GROUP BY
DISTINCT
Using index
根据
EXPLAIN
创建或调整索引:
type
ALL
key
NULL
WHERE
JOIN
ORDER BY
GROUP BY
WHERE col1 = 'A' AND col2 = 'B'
INDEX(col1, col2)
Extra
Using index
WHERE DATE(create_time) = '...'
LIKE '%keyword%'
OR
OR
重写SQL语句:
LIMIT OFFSET
LIMIT OFFSET
LIMIT 100000, 10
JOIN
SELECT t1.* FROM table t1 JOIN (SELECT id FROM table WHERE condition ORDER BY id LIMIT 100000, 10) AS t2 ON t1.id = t2.id;
JOIN
JOIN
ORDER BY
GROUP BY
filesort
Extra
Using filesort
ORDER BY
GROUP BY
UNION ALL
UNION
UNION ALL
优化数据库结构:
INT
BIGINT
VARCHAR(100)
VARCHAR(255)
JOIN
调整MySQL服务器配置(虽然不是直接通过日志优化查询,但对整体性能有影响):
innodb_buffer_pool_size
tmp_table_size
max_heap_table_size
GROUP BY
DISTINCT
优化是一个持续的过程,往往需要反复地“发现-分析-改进-监控”循环。没有一劳永逸的解决方案,只有不断地学习和实践。
以上就是mysql如何通过日志优化查询性能的详细内容,更多请关注php中文网其它相关文章!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号