mysql_技能10_索引优化准备

旧城冷巷雨未停 提交于 2020-02-28 04:55:21

show [session|global] status 提供服务器状态信息。
show [session|global] status 可以根据需要加上参数“session”或者“global”来显示 session级(当前连接)的计结果和 global 级(自数据库上次启动至今)的统计结果。如果不写,默认使用参数是“session”。

下面的命令显示了当前 session 中所有统计参数的值:
show status like ‘Com_______’;

show status like ‘Innodb_rows_%’;

定位:
慢查询日志 : 通过慢查询日志定位那些执行效率较低的 SQL 语句,用–log-slow-queries[=filename]选项启动时,mysqld 写一个包含所有执行时间超过 longquery_time 秒的 SQL 语句的日志文件。具体可以查看本书第 26 章中日志管理的相关部分。

show processlist : 慢查询日志在查询结束以后才纪录,所以在应用反映执行效率出现问题的时候查询慢查询日志并不能定位问题,可以使用show processlist命令查看当前MySQL在进行的线程,包括线程的状态、是否锁表等,可以实时地查看 SQL 的执行情况,同时对一些锁表操作进行优化。

explain分析执行计划:
type性能由好到差的连接类型为( system —> const -----> eqref ------> ref -------> refornull----> indexmerge —> indexsubquery -----> range -----> index ------> all )

explain 之 id
1) id 相同表示加载表的顺序是从上到下。
2) id 不同id值越大,优先级越高,越先被执行。
3) id 有相同,也有不同,同时存在。id相同的可以认为是一组,从上往下顺序执行;在所有的组中,id的值越大,优先级越高,越先执行。

explain 之 select_type
SIMPLE | 简单的select查询,查询中不包含子查询或者UNION | | PRIMARY | 查询中若包含任何复杂的子查询,最外层查询标记为该标识 | |
SUBQUERY | 在SELECT 或 WHERE 列表中包含了子查询 | |
DERIVED | 在FROM 列表中包含的子查询,被标记为 DERIVED(衍生) MYSQL会递归执行这些子查询,把结果放在临时表中 | |
UNION | 若第二个SELECT出现在UNION之后,则标记为UNION ; 若UNION包含在FROM子句的子查询中,外层SELECT将被标记为 : DERIVED | |
UNION RESULT | 从UNION表获取结果的SELECT |

explain 之 table
展示这一行的数据是关于哪一张表的

explain 之 key


key : 实际使用的索引, 如果为NULL, 则没有使用索引。

key_len : 表示索引中使用的字节数, 该值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下, 长度越短越好 。

explain 之 rows
扫描行的数量。

explain 之 extra
| using filesort	 | 说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取, 称为 “文件排序”, 效率低。 | 
| using temporary  | 使用了临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于 order by 和 group by; 效率低 | 
| using index			 | 表示相应的select操作使用了覆盖索引, 避免访问表的数据行, 效率不错。 |  


show profile分析SQL
select @@have_profiling;
-- YES

select @@profiling;
set profiling=1; //开启profiling 开关;

执行sql之后,再执行show profiles 指令, 来查看SQL语句执行的耗时.

show profile for query query_id 语句可以查看到该SQL执行过程中每个线程的状态和消耗的时间.

Sending data 状态表示MySQL线程开始访问数据行并把结果返回给客户端,而不仅仅是返回个客户端。由于在Sending data状态下,MySQL线程往往需要做大量的磁盘读取操作,所以经常是整各查询中耗时最长的状态。

打开trace , 设置格式为 JSON,并设置trace最大能够使用的内存大小,避免解析过程中因为默认内存过小而不能够完整展示:
SET optimizer_trace="enabled=on",end_markers_in_json=on; set optimizer_trace_max_mem_size=1000000;

执行sql语句:

检查informationschema.optimizertrace就可以知道MySQL是如何执行SQL的  
select * from information_schema.optimizer_trace\G;


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!