MySQL之优化SQL步骤

一 查询SQL执行频率

(1)查看语法

① 查看当前会话的所有统计参数的信息
 show status like 'Com_______ ';–7个下划线
 ② 查看全局信息
 show global status like 'Com_______ ‘;
 ③ 显示InnoDB的增删改查影响的信息
 show status like ‘Innodb_rows_%’;
 ④ 显示连接数
 show status like ‘connections’;
 ⑤ 显示慢查询次数
 show status like ‘slow_queries’;
 ⑥ 显示慢查询时间并修改时间
 show variables like ‘long_query_time’;
 set long_query_time=1;

(2)截图如下:

MySQL 自动 优化_mysql


MySQL 自动 优化_mysql_02


MySQL 自动 优化_MySQL_03

二 定位低效SQL语句

可以通过以下两种方式定位执行效率低的SQL语句

(1)慢查询日志:用–log-slow-queries[=file_name]选项启动时,mysqld写一个包含所有执行时间超过long_query_time秒的SQL语句的日志文件。具体后续日志会讲到。

(2)show processlist:慢查询日志在查询结束后才记录,所以并不能定位问题,可以使用该命令查看当前MySQL在进行的进程。

如下图所示:

MySQL 自动 优化_mysql_04

三 explain分析执行计划

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

命令:explain SQL语句;

截图如下:

MySQL 自动 优化_SQL_05


(1)explain之id

id字段是select查询的序列号,表示查询中执行select子句或是操作表的顺序,id有三种情况

① id相同表示加载表的顺序是从上到下

MySQL 自动 优化_数据库_06


② id不同,值越大优先级越高,越先被执行

MySQL 自动 优化_mysql_07


③ id有相同也有不同,id相同的可以认为是一组,从上往下执行;id不同的,id值越大优先级越高越先执行。

MySQL 自动 优化_MySQL_08


(2)explain之select_type

表示select的类型,常见的取值如下所示:

MySQL 自动 优化_MySQL 自动 优化_09


(3)explain之type

type显示的是访问类型,可取以下值:

MySQL 自动 优化_数据库_10


结果从最好到最坏是

null>system>const>eq_ref>ref>range>index>all

一般来说,我们需要保证查询至少达到range级别,最好达到ref级别(4)explain之key

有以下类型以及具体说明

MySQL 自动 优化_数据库_11


(5)explain之extra

其他额外的执行计划信息,有以下值

MySQL 自动 优化_数据库_12

四 show profile分析SQL

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

输入命令:select @@have_profiling;

截图如下:

MySQL 自动 优化_数据库_13

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

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

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

命令:show profiles;

截图如下:

MySQL 自动 优化_SQL_14


MySQL 自动 优化_数据库_15


也可以通过show profile for query Query_id;来查看该查询id下的所有耗时情况的具体信息

MySQL 自动 优化_MySQL_16


注意: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;

部分截图如下:

MySQL 自动 优化_数据库_17