[MySQL]二.使用explain和profiling分析SQL语句

MySQL基本io信息查询:

        show status like 'innodb_data_r%'      读操作

        show status like 'innodb_data_w%'     数据写的io次数

        show status like 'innodb_log_wrt%'     日志写入操作

        show status like 'innodb_db%'        既读既写

IO计算公式:

innodb_data_reads  +  innodb_data_writes  +  innodb_ddblwr_writes   +   innodb_log_writes = io次数

注:数据库IO性能和系统配置有关


查询数据表的情况:

        show create table table_name

查询表索引使用情况:

        show indexes from table_name

查询表的状态:

        show table status like 'table_name';

查询表结构:

        desc table_name;

定位查看sql执行:

        show full processlist;


explain分析SQL:

使用方法:explain + 需要分析的SQL语句

            例: explain select * from user where id = 1

explain分析SQL结果集合:

 id                    =>     优化器选定的执行计划中查询的序列号。

select_type    =>     当前sql查询方式(不同的SQL会有不同的查询方式 一般不会过多关注)

table               =>     查询数据库表名称

type                =>     查询类型(一般SQL分析看这里 需要重点关注)

    type可能出现的结果:

                    . all:全表扫描

                    . const::可以理解为常量,最多只会有一条记录匹配,由于是常量,实际上只需要读一次 通常主要应用在主键和唯一键索引

                    . eq_ref:最多只会有一条匹配结果,一般是通过主键或唯一键索引来访问

                    . fulltext:进行全文索引检索

                    . index:全索引扫描

                    index_merge:查询中同时使用两个(或更多)索引,然后对索引结果进行合并,在读取表数据

                    . index_subquery:子查询中的返回结果字段组合是一个索引(或索引组合),但不是一个主键或唯一索引

                    . rang:索引范围扫描

                    . ref:join语句中被驱动表索引引用的查询

                    ref_or_null:与ref的唯一区别就是使用索引引用的查询之外再增加一个空值的查询

                    . system:系统表,表中只有一行数据

                    . unique_subqery:子查询中的返回结果字段组合式主键或唯一约束。

possible_keys     =>      显示可以利用的索引。如果没有任何索引可以使用,就会显示程null,这项内容对优化索引时的调整很重要

(在建立索引以后使用分析SQL语句应重点关注 是否使用到了新建的索引)

key                        =>     优化器从possible_keys中选择使用的索引(索引某些时候可能会失效 但是可以通过SQL语句来强制使用某个索引)

key_len                 =>     被选中使用索引的索引建长度

ref                          =>     列出是通过常量,还是某个字段的某个字段来过滤的

rows                      =>     扫描的数据量(并不一定准确 和innodb的数据存储子页节点有关系)

extra                      =>     查询中每一步实现的额外细节信息

extra可能出现的结果:

              using index : 出现此结果说明mysql使用了覆盖索引,避免访问了表的数据行

              . using where : 出现此结果说明服务器在存储引擎收到结果后对数据进行了过滤 (既:可以理解为使用了查询条件对于数据进行过滤)

              . using temporary :出现此结果说明MySQL在查询的时候使用了临时表

              . using filesort :出现此结果说明MySQL对数据使用了一个外部的索引排序(可以理解为没有使用索引)

注:当出现using temporary 或 using filesort时候说明此SQL语句需要进行优化操作


profiling分析SQL语句:

profiling作用:分析SQL语句性能问题点 主要记录的信息是SQL语句执行的时间;

profiling默认是关闭的状态 通过SQL   set profiling = 1来开启;(此条修改为局部修改 仅在当前进程有效 非全局set)

使用方法:开启了profiling以后执行一次需要分析的SQL语句 然后执行show profiles 就可以看到此SQL执行的时间;

profiling使用示例

若想知道详细的信息则需要通过sql: show profile for query 3 来进行查询

show profile for query 使用示例

注:profiling保存的信息都是临时的 并不是缓存在表中的


show profile for query 信息分析:

starting:开启查询查询需要的时间

checking permissions:权限校验需要的时间

Opening tables:打开表所需要使用的时间

init:初始化

System lock:系统锁

optimizing:优化器

等。。。。。。。

主要关注Sending data行的执行时间 此行为返回数据所花费的时间

可以通过show profile cpu,block io for query 1来查看更多的详细信息

show profile cpu,block io for query 1查看cpu使用情况和io的一些信息使用示例

你可能感兴趣的:([MySQL]二.使用explain和profiling分析SQL语句)