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执行的时间;
若想知道详细的信息则需要通过sql: show profile for query 3 来进行查询
注:profiling保存的信息都是临时的 并不是缓存在表中的
show profile for query 信息分析:
starting:开启查询查询需要的时间
checking permissions:权限校验需要的时间
Opening tables:打开表所需要使用的时间
init:初始化
System lock:系统锁
optimizing:优化器
等。。。。。。。
主要关注Sending data行的执行时间 此行为返回数据所花费的时间
可以通过show profile cpu,block io for query 1来查看更多的详细信息