Mysql高级优化知识笔记--分析SQL步骤

1.分析SQL四步骤:

1.利用慢查询日志捕获需要优化的SQL
2.通过mysql的EXPLAIN 分析或者Show Profile更系统分析
3.SQL优化
4.数据库参数配置优化(此步骤需要DBA抉择)

2.利用慢查询日志捕获需要优化的SQL

  • 1.慢查询日志
MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,
**具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。** 

long_query_time的默认值为10,意思是运行10秒以上的语句。(注意)

由他来查看哪些SQL超出了我们的最大忍耐时间值,比如一条sql执行超过5秒钟,
我们就算慢SQL,希望能收集超过5秒的sql,结合之前explain进行全面分析。
  • 查看慢查询日志是否开启
使用命令:SHOW VARIABLES LIKE '%slow_query_log%';
默认情况下slow_query_log的值为OFF,表示慢查询日志是禁用的,可以通过设置slow_query_log的值来开启
  • 开启慢查询日志功能
1.当前数据库有效:[ 使用命令:set global slow_query_log=1 ]
	使用set global slow_query_log=1开启了慢查询日志只对当前数据库生效,如果MySQL重启后则会失效。
	全局变量设置,对当前连接不影响。对当前连接立刻生效。
	
2.永久生效:[修改mysql的配置文件(my.cnf)]
	如果要永久生效,就必须修改配置文件my.cnf(其它系统变量也是如此)修改my.cnf文件,
	[mysqld]下增加或修改参数slow_query_log 和slow_query_log_file后,然后重启MySQL服务器。
	例如:也即将如下两行配置进my.cnf文件:
	slow_query_log =1
	slow_query_log_file=/var/lib/mysql/wangchong-slow.log
	注意:关于慢查询的参数slow_query_log_file ,它指定慢查询日志文件的存放路径,
	**系统默认会给一个缺省的文件host_name-slow.log(如果没有指定参数slow_query_log_file的话)**
 
  • 查看和设置慢查询的long_query_time值
1.查看当前系统中有多少条慢查询记录:
	show global status like '%Slow_queries%';
	
2.使用命令查看当前数据库的long_query_time值:
	SHOW VARIABLES LIKE 'long_query_time%';
	
3.当前数据库生效:[ 使用命令 set global long_query_time=2 或者 set session long_query_time=2 ]
	使用命令 set global long_query_time=2 修改为阙值到2秒钟的就是慢sql.。
	**修改后发现long_query_time并没有改变。需要重新连接或新开一个会话才能看到修改值。
	或者通过set session long_query_time=2来改变当前session变量;**
4.永久生效:[ 在配置文件my.cnf中修改 ]
【mysqld】下配置:
	slow_query_log=1;
	slow_query_log_file=/var/lib/mysql/atguigu-slow.log
	long_query_time=2;
	log_output=FILE
  • 自动化工具辅助统计慢查询–日志分析工具[mysqldumpslow]
1.得到返回记录集最多的10个SQL
	mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log
		
2.得到访问次数最多的10个SQL
	mysqldumpslow -s c -t 10 /var/lib/mysql/atguigu-slow.log
		
3.得到按照时间排序的前10条里面含有左连接的查询语句
	mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/atguigu-slow.log
		
4.另外建议在使用这些命令时结合 | 和more 使用 ,否则有可能出现爆屏情况
	mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log | more

3.通过mysql的EXPLAIN 分析

  • EXPLAIN 是什么
使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。
分析你的查询语句或是表结构的性能瓶颈。

性能瓶颈有以下几点:
	①.CPU:SQL中对大量数据进行比较、关联、排序、分组(最大的压力在于 比较)
	②.IO:实例内存满足不了缓存数据或排序等需要,导致产生大量 物理 IO。查询执行效率低,扫描过多数据行。
	③.锁:不适宜的锁的设置,导致线程阻塞,性能下降。死锁,线程之间交叉调用资源,导致死锁,程序卡住。
	④.服务器硬件的性能瓶颈:top,free, iostat和vmstat来查看系统的性能状态
  • 使用方式
Explain + SQL语句
例如:EXPLAIN select * from user;

4.Show Profile 更系统分析

  • Show Profile是什么
是mysql提供可以用来分析当前会话中语句执行的资源消耗情况。可以用于SQL的调优的测量。
默认情况下,参数处于关闭状态,并保存最近15次的运行结果。

  • Show Profile功能使用步骤
1.查看是否支持:[使用命令:Show  variables like 'profiling';]
	Show  variables like 'profiling'; 默认是关闭,使用前需要开启
	
2.开启:[ 使用命令:set profiling=1; ]
	set profiling=1; 
	
3.运行SQL。例如下面两条语句:
	select * from user group by id%10 limit 150000; 
	select * from emp group by id%20  order by 5;
	
4.查看所有的profiles,获取上面两条的QueryID以便进行第5步:[使用命令:show profiles;]
	show profiles;
	例如:select * from user group by id%10 limit 150000; 这个的QueryID为123
	
5.诊断SQL。[使用命令:show profile cpu,block io for query  n(n为上一步前面的问题SQL数字号码--QueryID) ]
	show profile cpu,block io for query  123 ;
	show profile的参数:
	type:  
	 | ALL                        --显示所有的开销信息  
	 | BLOCK IO                --显示块IO相关开销  
	 | CONTEXT SWITCHES --上下文切换相关开销  
	 | CPU              --显示CPU相关开销信息  
	 | IPC              --显示发送和接收相关开销信息  
	 | MEMORY           --显示内存相关开销信息  
	 | PAGE FAULTS      --显示页面错误相关开销信息  
	 | SOURCE           --显示和Source_function,Source_file,Source_line相关的开销信息  
	 | SWAPS            --显示交换次数相关开销的信息

  • profile常遇到字段说明:
①.converting HEAP to MyISAM :查询结果太大,内存都不够用了往磁盘上搬了。
②.Creating tmp table: 创建临时表--拷贝数据到临时表,用完再删除
③.Copying to tmp table on disk: 把内存中临时表复制到磁盘,危险!!!
④.locked:锁住

5.数据库参数配置优化

例如:数据库的缓存大小、jion的缓冲大小等,此处待DBA抉择优化。

发布了18 篇原创文章 · 获赞 2 · 访问量 654

猜你喜欢

转载自blog.csdn.net/qq_34699995/article/details/99125996
今日推荐