MySQL之优化SQL步骤(高级)

MySQL之优化SQL步骤

一 查询SQL执行频率

(1)查看语法

① 查看当前会话的所有统计参数的信息
show status like 'Con_______ ';–7个下划线
② 查看全局信息
show global status like 'Con_______ ‘;
③ 显示InnoDB的增删改查影响的信息
show status like ‘Innodb_rows_%’;

(2)截图如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二 定位低效SQL语句

可以通过以下两种方式定位执行效率低的SQL语句
(1)慢查询日志:用–log-slow-queries[=file_name]选项启动时,mysqld写一个包含所有执行时间超过long_query_time秒的SQL语句的日志文件。具体后续日志会讲到。
(2)show processlist:慢查询日志在查询结束后才记录,所以并不能定位问题,可以使用该命令查看当前MySQL在进行的进程。
如下图所示:
在这里插入图片描述

三 explain分析执行计划

通过查询到的效率低的SQL语句后,通过explain或desc命令获取MySQL执行select语句的信息

命令:explain SQL语句;

截图如下:
在这里插入图片描述
(1)explain之id
id字段是select查询的序列号,表示查询中执行select子句或是操作表的顺序,id有三种情况
① id相同表示加载表的顺序是从上到下
在这里插入图片描述
② id不同,值越大优先级越高,越先被执行
在这里插入图片描述
③ id有相同也有不同,id相同的可以认为是一组,从上往下执行;id不同的,id值越大优先级越高越先执行。
在这里插入图片描述
(2)explain之select_type
表示select的类型,常见的取值如下所示:
在这里插入图片描述
(3)explain之type
type显示的是访问类型,可取以下值:
在这里插入图片描述
结果从最好到最坏是
null>system>const>eq_ref>ref>range>index>all
一般来说,我们需要保证查询至少达到range级别,最好达到ref级别

(4)explain之key
有以下类型以及具体说明
在这里插入图片描述
(5)explain之extra
其他额外的执行计划信息,有以下值
在这里插入图片描述

四 show profile分析SQL

show profiles能够在做SQL优化时帮助我们了解时间耗费情况。
(1)通过have_profiling参数,可以查看MySQL是否支持profile

输入命令:select @@have_profiling;

截图如下:
在这里插入图片描述

(2)可以通过set语句在session级别开启profile

查看是否开启:select @@ progiling;
开启命令:set profiling=1;

(3)查看SQL语句的耗时情况

命令:show profiles;

截图如下:
在这里插入图片描述
在这里插入图片描述
也可以通过show profile for query Query_id;来查看该查询id下的所有耗时情况的具体信息
在这里插入图片描述
注意:Sending data状态是MySQL线程开始访问线程并把数据返回给客户端的过程,需要做大量的磁盘读取操作,所有非常耗时。
另外你也可以进一步选择all,CPU,block io,context switch,page faults等具体的耗时信息。

五 trace分析优化器执行计划

MySQL5.6提供了对SQL的跟踪trace,通过trace能够进一步了解到为什么选择计划A而不是B。
(1)打开trace并设置格式为json以及trace的最大使用内存大小

set optimizer_trace="enabled=on",end_markers_in_json=on;
set optimizer_trace_max_size=1000000;

(2)执行SQL语句

select * from tb_item where id < 4;

(3)检查information_schema.optimizer_trace就可以查看MySQL是如何执行SQL的

select * from information_schema.optimizer_trace\G;

部分截图如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/hcyxsh/article/details/114806037
今日推荐