当前位置:Gxlcms > 数据库问题 > 记录一次sql优化查询

记录一次sql优化查询

时间: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 temporaryUsing 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   

人气教程排行