记录一次sql优化查询

场景:关联查询,一张主表关联4张表进行查询。主表数据量是16万,其中被关联的一张表的数量是6万。


遇到页面响应速度过慢的情况,首先考虑是否是sql查询缓慢引起的。

第一步开启mysql的慢查询日志(网上教程很多,本篇文章不再赘述)

第二步分析慢查询日志,这里要说下分析工具。常用的有两种,一是mysql自带的mysqldumpslow工具,二是pt-query-slow工具。后者需要自行安装,下面针对两种工具的使用进行说明:



(1) mysqldumpslow
 执行mysqldumpslow,如果出现命令mysqldumpslow不存在的情况,需要进行如下处理(要清楚mysql的安装位置):

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的使用,网上教程很多,这里不再详细介绍

原文地址:https://www.cnblogs.com/lty-fly/p/12619992.html

时间: 2024-11-08 23:43:01

记录一次sql优化查询的相关文章

第四篇:记录相关操作 SQL逻辑查询语句执行顺序

http://www.cnblogs.com/linhaifeng/articles/7372774.html 一 SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOIN <right_table> ON <join_condition> WHERE <where_condition> GROUP BY <group_by

SQL优化 查询语句中,用 inner join 作为过滤条件和用where作为过滤条件的区别

前段时间遇到一个存储过程,参数之一是一个字符串,实际作用是在存超过中是作为一个查询条件处理的 在存储过程中,把字符串拆分成一个临时表之后作key值,作为一个查询条件,逻辑实现上有两种处理方式 insert into #t select key from split_function('传递进来的字符串',',') 第一种是与物理表做inner join,类似如下 select * from tableA a inner join tableB b on a.id=b.id inner join

百万级sql优化查询

SQL版本 5.7 有一张流水表,未分库分表,目前的数据量为950w,分页查询使用到了limit,优化之前的查询耗时167s左右 (execution: 16s831ms, fetching: 107 ms) 按照下文的方式调整SQL后,耗时347ms (execution: 163 ms, fetching: 184 ms):优化前的SQL类似这样: -- 优化前SQL SELECT 各种字段 FROM `table_name` WHERE 各种条件 LIMIT 0,10; --优化后 SEL

记录一个sql优化后大大提高查询效率的情形

众所周知,sql写得怎么样,对于查询效率的影响是颇大的.下面看一个比较普通的查询: 假设一张表有event_date和event_time2个字段分别表示日期和时间,现在直接给你一个时间字符串,这个时间字符串是“日期+时间”的组合,现在需要按时间范围过滤出一部分数据.如果你不转弯的话,很有可能你会按照惯性思维使用concat(event_date, event_time)连接函数,如: SELECT A, MAX(B) AS B,SUBSTR(CONCAT(event_date, event_t

提高SQL查询效率(SQL优化)(转载)

(转自http://blog.csdn.net/sforiz/article/details/5345359) 我们要做到不但会写SQL,还要做到写出性能优良的SQL语句. (1)选择最有效率的表名顺序(只在基于规则的优化器中有效): Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询, 那就需要选择交叉表

sql优化经历(转存+记录)

sql优化经历 补充:看到这么多朋友对sql优化感兴趣,我又重新补充了下文章的内容,将更多关于sql优化的知识分享出来, 喜欢这篇文章的朋友给个赞吧,哈哈,欢迎交流,共同进步. 2015-4-30补充:非常感觉编辑的推荐,同时又对慢查询语句优化了一遍,并附上优化记录,欢迎阅读文章. 场景 我用的数据库是mysql5.6,下面简单的介绍下场景 课程表 10) ) 数据100条 学生表: 10) ) 数据70000条 学生成绩表SC select s.* from Student s where s

提高SQL查询效率(SQL优化)

要提高SQL查询效率where语句条件的先后次序应如何写 http://blog.csdn.net/sforiz/article/details/5345359 我们要做到不但会写SQL,还要做到写出性能优良的SQL语句. (1)选择最有效率的表名顺序(只在基于规则的优化器中有效): Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表

利用SET STATISTICS IO和SET STATISTICS TIME 优化SQL Server查询性能

首先需要说明的是这篇文章的内容并不是如何调节SQL Server查询性能的(有关这方面的内容能写一本书),而是如何在SQL Server查询性能的调节中利用SET STATISTICS IO和SET STATISTICS TIME这二条被经常忽略的Transact-SQL命令的. 从表面上看,查询性能的调节是一件十分简单的事.从本质上讲,我们希望查询的运行速度能够尽可能地快,无论是将查询运行的时间从10分钟缩减为1分钟,还是将运行的时间从2秒钟缩短为1秒种,我们最终的目标都是减少运行的时间. 尽

SQL Server 查询性能优化 相关文章

来自: SQL Server 查询性能优化——堆表.碎片与索引(一) SQL Server 查询性能优化——堆表.碎片与索引(二) SQL Server 查询性能优化——覆盖索引(一) SQL Server 查询性能优化——覆盖索引(二) SQL Server 查询性能优化——创建索引原则(一) SQL Server 查询性能优化——创建索引原则(二) SQL Server 查询性能优化——索引与SARG(一) SQL Server 查询性能优化——索引与SARG(二) SQL Server 查