1、查看SQL执行效率
概述 :
在不清楚为什么效率查询慢的时候 ,我们大多数都认为与数据库有关 。那我们首先查询 MySQL 数据库的运行状态 ,通过跑了一天的生产环境 , 我们能查到数据库执行的所有SQL的类型(CRUD)以及执行时间。
查询命令 :
这里我列举几个常用的命令 , 具体详细的、比较全面的命令可参考我下面给到的MySQL手册(附有链接)
-- 查看 select 语句的执行行数 :
show status like 'com_select';
-- 查看 insert 语句的执行行数 :
show status like 'com_insert';
-- 查看 update 语句的执行行数 :
show status like 'com_update';
-- 查看 delete 语句的执行行数 :
show status like 'com_delete';
-- 获取InnoDB存储引擎相关的统计信息(返回“innodb_rows_”开头的所有状态变量及其对应的值):
show status like 'Innodb_rows_%';
注 :MySQL :: MySQL 5.7 参考手册 :: 5.1.9 服务器状态变量
2、定位低效率执行SQL
两种方式 :
① 慢查询日志 :
通过慢查询日志定位那些执行效率比较低的SQL语句 (用--log-slow-queries[=file_name]选项启动时,mysqlId写一个包含所有执行时间超过long_query_time秒时间的SQL语句的日志文件)
# 慢查询,通常指花了2s以上的查询(默认10s)
show global status like 'slow_queries';
② show processlist :
慢查询日志在查询结束以后才记录,所以在反映执行效率出现问题的时候查询慢查询日志并不能定位问题 , 可以使用 show processlist 命令查看当前MySQL在进行的线程(包括线程的状态、是否锁表等),并可以实时地查看SQL的执行情况 , 同时对一些锁表操作进行优化。
3、分析SQL的执行过程(show profile 、explain分析执行计划)
方式一 : show profile(查询sql整个执行过程所消耗的时间)
注意 : MySQL从5.0.37版本开始增加了对show profile和show profiles语句的支持,所以要想使用此功能,要确保版本在5.0.37之后。show profiles能够在做SQL优化时帮助我们了解SQL语句的性能耗费。
在MySQL数据库中,可以通过配置profiling参数来启用SQL剖析。该参数可以在全局和session级别来设置。对于全局级别则作用于整个MySQL实例,而session级别紧影响当前session。该参数开启后,后续执行的SQL语句都将记录其资源开销,诸如IO,上下文切换,CPU,Memory等等。根据这些开销进一步分析当前SQL瓶颈从而进行优化与调整。
通过have_profiling参数,能够看到当前MySQL是否支持profile:
默认profiling是关闭的,那么可以通过set语句在session级别开启profiling:
set profiling=1
通过profile,能够清楚的了解SQL执行的过程。
比如输入show profiles命令后,我们可以看到各个sql语句执行的耗时:
queryid表示当前查询的id;query表示执行的sql操作;duration表示sql操作执行的时间耗费。
执行完上面的show profiles命令后,可以通过下面的命令来具体分析某个sql语句的时间具体耗费情况:
show profile for query query_id
比如分析query_id为175的sql操作的具体情况:
show profile for query 175
结果如下:
Status表示状态阶段,而Duration表示该状态阶段的耗时。
在获取了最小消耗时间的线程状态之后,mysql支持进一步选择all、cpu、block io、page faults等明细类型查看mysql在使用什么资源上耗费了过高的时间,如果输入:
show profile for all query query_id
复制代码
则可以展示所有的信息,部分如下:
方式二 : explain 分析执行计划(重点)
几个必须掌握的SQL优化技巧(三):Explain分析执行计划 (qq.com)
这里我就不重点细说了 , 根据上述链接查看即可,我主要根据网上知识点简单概况 :
① 字段 :
id : 查询的优先级 , 数值越大优先级越高 , 同级别从上到下依次执行
select_type : 查询类型
type : 访问类型
key : 是否使用索引
extra : 查询的方式说明
4、进行SQL优化
根据上述的分析即可 , 进行sql针对性的优化 , 我认为一般索引最为关键 :
① 避免索引失效 : 12条规则 (详细列子可百度)
1) 全值匹配 , 对索引中所有列都指定具体值 ;
2) 最左前缀法则 ;
3) 范围查询右边的列 , 不能使用索引 ;
4) 不要在索引列上进行运算操作 , 索引将失效 ;
5) 字符串不加单引号 , 造成索引失效 ;
6) 尽量使用覆盖索引 , 避免 select * ;
7) 用 or 分割开的条件 , 如果 or 前的条件中的列有索引 , 而后面的列中没有索引 , 那么涉及的索引都不会被用到 ;
8) 以 % 开头的 Like 模糊查询 , 索引失效 ;
9) 如果MySQL评估使用索引比全表更慢 , 则不使用索引 ;
10) is NULL 走索引 , is NOT NULL 有时索引失效 ;
11) in 走索引 , not in 索引失效 ;
12) 单列索引 和 复合索引(尽量使用复合索引 ,而少使用单列索引) .
② SQL提示 : 强制使用SQL索引
若有不足之处 , 请多多包涵 , 希望能对大家有所帮助 !