欢迎来到徐庆高(Tea)的个人博客网站
磨难很爱我,一度将我连根拔起。从惊慌失措到心力交瘁,我孤身一人,但并不孤独无依。依赖那些依赖我的人,信任那些信任我的人,帮助那些给予我帮助的人。如果我愿意,可以分裂成无数面镜子,让他们看见我,就像看见自己。察言观色和模仿学习是我的领域。像每个深受创伤的人那样,最终,我学会了随遇而安。
当前位置: 日志文章 > 详细内容

MySQL慢查询工具的使用小结

2025年08月10日 Mysql
使用mysql的慢查询工具可以帮助开发者识别和优化性能不佳的sql查询。以下是详细深入的步骤和代码示例,帮助你使用mysql的慢查询工具来进行查询分析和优化。一、启用慢查询日志首先,你需要确保mysq

使用mysql的慢查询工具可以帮助开发者识别和优化性能不佳的sql查询。以下是详细深入的步骤和代码示例,帮助你使用mysql的慢查询工具来进行查询分析和优化。

一、启用慢查询日志

首先,你需要确保mysql的慢查询日志功能是启用的。慢查询日志记录了所有执行时间超过指定阈值的sql查询。

1.1 编辑mysql配置文件

编辑my.cnf(linux)或my.ini(windows)配置文件,添加或修改以下配置:

[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  # 记录未使用索引的查询(可选)

1.2 重启mysql服务

应用配置更改后,重启mysql服务:

sudo systemctl restart mysql  # 对于systemd系统
# 或者
sudo service mysql restart  # 对于init.d系统

二、配置动态参数(可选)

如果无法修改配置文件或者不想重启mysql服务,也可以动态设置这些参数:

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 = 1;

三、分析慢查询日志

启用慢查询日志后,mysql会记录执行时间超过long_query_time阈值的查询。你可以使用mysqldumpslow工具或pt-query-digest工具来分析这些日志。

3.1 使用mysqldumpslow工具

mysqldumpslow是mysql自带的工具,用于分析慢查询日志。

mysqldumpslow -s t -t 10 /var/log/mysql/mysql-slow.log

命令说明:

  • -s:排序方式(t:按照查询时间排序,c:按照次数排序,l:按照锁时间排序,r:按照返回记录数排序)。
  • -t:显示前n条记录。
  • /var/log/mysql/mysql-slow.log:慢查询日志文件的位置。

示例输出:

reading mysql slow query log from /var/log/mysql/mysql-slow.log
count: 3  time=5.00s (15s)  lock=0.00s (0s)  rows=10.0 (30), root[root]@localhost
  select * from orders where customer_id = '12345'

count: 2  time=2.50s (5s)  lock=0.00s (0s)  rows=100 (200), root[root]@localhost
  select * from products where price > 1000

3.2 使用pt-query-digest工具

pt-query-digest是percona toolkit中提供的强大工具,用于分析慢查询日志。

pt-query-digest /var/log/mysql/mysql-slow.log > slow_query_report.txt

示例输出(部分):

# overall: 80 total, 10 unique, 0.01 qps, 0.01x concurrency _______________
# time range: 2021-10-01 10:00:00 to 2021-10-01 11:00:00
# attribute    total   min     max     avg     95%  stddev  median
# ============ ======= ======= ======= ======= ======= ======= =======
# count          80
# exec time     30s     50ms    2s      375ms   1s    450ms   300ms
# lock time     1s      0ms     50ms    12ms    25ms  10ms    15ms
# rows sent     800     1       100     10      50    20      5
# rows examine  8000    10      500     100     400   150     75

四、优化建议

根据慢查询日志的分析结果,可以采取以下优化措施:

4.1 创建或优化索引

根据分析结果中显示的频繁查询和慢查询,创建或优化索引。

-- 创建索引
create index idx_customer_id on orders(customer_id);

-- 优化查询语句
select * from orders where customer_id = '12345';

4.2 优化查询语句

重写具有高执行时间和高锁等待时间的查询,优化查询逻辑。

优化前:

select * from products where price > 1000;

优化后(假设创建了索引):

alter table products add index (price);
select * from products where price > 1000;

4.3 使用explain分析执行计划

使用explain命令进一步分析查询的执行计划,找出优化的具体措施。

explain select * from orders where customer_id = '12345';

示例输出:

+----+-------------+--------+------------+------+---------------+---------------+---------+-------+------+----------+-------------+
| id | select_type | table  | partitions | type | possible_keys | key           | key_len | ref   | rows | filtered | extra       |
+----+-------------+--------+------------+------+---------------+---------------+---------+-------+------+----------+-------------+
|  1 | simple      | orders | null       | ref  | idx_customer_id | idx_customer_id | 4       | const |    1 |   100.00 | using index |
+----+-------------+--------+------------+------+---------------+---------------+---------+-------+------+----------+-------------+

4.4 分区和分表

对于大表,考虑使用分区或分表策略,以提高查询效率。

-- 创建分区表
create table orders (
    order_id int not null,
    order_date date not null,
    customer_id int not null,
    amount decimal(10, 2) not null
)
partition by range (year(order_date)) (
    partition p0 values less than (2020),
    partition p1 values less than (2021),
    partition p2 values less than (2022),
    partition p3 values less than maxvalue
);

五、监控和调整

  1. 监控工具:使用监控工具,如prometheus、grafana、percona monitoring and management (pmm)等,实时监控mysql性能。
  2. 定期检查:定期检查慢查询日志、错误日志和性能指标,及时发现问题并优化。
  3. 自动化调优:使用自动化调优工具,如mysql tuner、percona toolkit等,定期进行自动化调优。

5.1 使用mysql tuner

下载并运行mysql tuner:

wget http://mysqltuner.pl/ -o mysqltuner.pl
chmod +x mysqltuner.pl
./mysqltuner.pl

根据mysql tuner的建议调整配置:

[mysqld]
innodb_buffer_pool_size = 8g  # 根据建议调整缓冲池大小
query_cache_size = 512m  # 根据建议调整查询缓存大小

六、总结

通过启用和分析慢查询日志,可以深入了解mysql查询性能的瓶颈。结合mysqldumpslowpt-query-digest工具的分析结果,可以采取针对性的优化措施,包括创建索引、优化查询语句、调整配置参数等,从而显著提升mysql数据库的性能和稳定性。通过定期监控和调整,可以确保数据库在高负载和大数据量情况下持续高效运行。

到此这篇关于mysql慢查询工具的使用小结的文章就介绍到这了,更多相关mysql 慢查询工具内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!