时间:2021-07-01 10:21:17 帮助过:33人阅读
ln -s /www/server/mysql/bin/mysqldumpslow /usr/bin/
简单使用:
mysqldumpslow -t 10 mysql-slow.log
含义:返回查询时间最慢的前10条记录
相关参数:
-s:是表示按照何种方式排序
c:访问计数
l:锁定时间
r:返回记录
t:查询时间
al:平均锁定时间
ar:平均返回记录数
at:平均查询时间
-t:是top n的意思,即为返回前面多少条的数据
-g:后边可以写一个正则匹配模式,大小写不敏感的
(2) pt-query-slow
安装:
yum install perl-DBI
yum install perl-DBD-MySQL
yum install perl-Time-HiRes
yum install perl-IO-Socket-SSL
wget percona.com/get/pt-query-digest
chmod u+x pt-query-digest
mv pt-query-digest /usr/bin/
使用:
pt-query-digest /www/server/data/mysql-slow.log
常见用法:
(1)分析最近12小时内的查询
pt-query-digest --since=12h /www/server/data/mysql-slow.log > slow_report1.log
(2)分析指定时间范围内的查询
pt-query-digest /www/server/data/mysql-slow.log --since ‘2020-03-20 09:30:00‘ --until ‘2020-03-27 13:00:00‘ > slow_report2.log
通过查看找到耗时较长的sql:
SELECT
`c`.*,
c.price unit_price,
d. NAME AS category_name,
b.nickname creator,
a.nickname owner_name
FROM
`material` `c`
LEFT JOIN `category` `d` ON `c`.`category_id` = `d`.`id`
LEFT JOIN `admin` `a` ON `c`.`operator_id` = `a`.`id`
LEFT JOIN `admin` `b` ON `c`.`creator_id` = `b`.`id`
LEFT JOIN `stock` `s` ON `c`.`id` = `s`.`material_id`
WHERE
`c`.`status` = ‘1‘
AND `c`.`company_id` = ‘1‘
ORDER BY
`c`.`created_at` DESC
LIMIT 0,
10
对这条sql执行explain:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | c | ref | idx_company_id, idx_status |
idx_company_id | 4 | const | 33872 | Using where; Using temporary; Using filesort |
1 | SIMPLE | d | eq_ref | PRIMARY | PRIMARY | 4 | skxx.c.category_id | 1 | |
1 | SIMPLE | a | eq_ref | PRIMARY | PRIMARY | 4 | skxx.c.category_id | 1 | Using where |
1 | SIMPLE | b | eq_ref | PRIMARY | PRIMARY | 4 | =skxx.c.category_id | 1 | Using where |
1 | SIMPLE | s | ALL | 1683 | Using where; Using join buffer (Block Nested Loop) |
看到执行计划后发现第一行Extra出现了Using temporary
和Using filesort
,最后一行出现Using join buffer (Block Nested Loop)
,这几项说明在查询时使用了临时表和文件排序,性能很不好。尝试给所有关联条件添加索引后,再次执行explain,发现Using temporary
和 Using join buffer (Block Nested Loop)
都不见了,但是仍然有文件排序!定位到 order by
发现列created_at并未添加索引,于是添加索引,再次执行explain,Using filesort
已经没有了!!
有关explain的使用,网上教程很多,这里不再详细介绍
记录一次sql优化查询
标签:需要 多少 oss space reg 意思 处理 tab toc