查询sql执行频率
下面步骤显示了当前session中所有统计参数的值
show status like 'Com______'
Com_begin 0
Com_check 0
Com_clone 0
Com_flush 0
Com_grant 0
Com_purge 0
Com_reset 0
查看Innodb在进行增删改查时候影像的行数
show status like innodb_row_like%
定位低效率执行SQL
可以通过以下两种方式定位执行效率低的SQL语句
- 慢查询日志,通过慢查询日志定位执行效率低的SQL语句,用–log-slow-querief=file_name选项启动发,mysqld写一个包含所有执行时间超过long_query_time秒的SQL语句的日志文件。
- show processlist:慢查询日志在在查询结束以后才记录,所以在应用反映执行效率出问题的时候查询慢日志并不能定位问题,可以使用show processlist命令查看当前Mysql在进行的线程,包括线程的状态,是否锁表等,可以实时地查看SQL的执行情况,同时对一些表锁操作进行优化。
```
1,id:用户登录mysql时,系统分配的"connection_id",可以使用函数connection_id()查看
2,user列:显示当前用户,如果不是root,这个命令参数就只显示用户权限返回的sql
3.host:显示这个语句是从哪个ip的哪个端口上发的,可以用来跟踪出现问题的用户
4,db:显示进程连接的是哪个数据库
5,command列:显示当前连接的执行的命令,一般取值为休眠,查询,连接等
6,time:显示这个操作持续的时间
### explain分析执行计划
```sql
explain sql语句
- id:查询的序号,是一组数字,表示的是查询中执行select或操作表的顺序
- select_type,常见的取值有SIMPLE(简单表,即不使用表连接或者子查询),PRIMARY(主查询,即外层的查询),UNION(UNIO中的第二个或者后面的查询语句),SUBQUERY(子查询中的第一个select)等
- table 输出结果的表
- type 表示表的连接类型,性能由好到差的连接类型为(system,const,eq_ref,ref,ref_or_null,index_merge,index_subquery,range,index,all)
- key 表示实际使用的索引
- key_len 索引字段的长度
- rows 扫描行的数量
- extra 执行情况的说明和描述
- prossible_key 可能用到的索引
select-type
表示SELECT的类型,常见的取值如下
- SIMPLE 简单的select查询,查询中不包含子查询或者UNION
- PRIMARY 查询中包含任何复杂的子查询,最外层标记为该标识
- SUBQUERY 在select或者where中包含了子查询
- DERIVED 在FROM列表中包含的子查询,被标记为DERIVED(衍生)MYSQL会递归执行这些子查询,把结果放到临时表中
- UNION 若第二个SELECT出现在UNION之后,则标记为NION,若UNION包含在FROM子句的子查询中,外层SELECT将被标记为:DERIVED
- UNION Result 从UNION表中获取结果的select
show profile分析SQL
mysql从5.7.3版本开始增加了对show profiles和show profile语句的支持。show profile能够在做MYSQL优化时帮助我们了解时间都耗费到哪去了。
通过have_profiling参数,能够看到当前Mysql是否支持profile
select @@have_profiling
如果未开启,则需要开启
set profiling=1
trace 分析优化器执行计划
MYSQL5.6提供了对SQL的跟踪trace,通过trace文件能够进一步了解为什么优化器选择A计划,而不选择B计划。
打开trace,设置格式为json,设置trace最大能够使用的内存大小,避免解析过程中因为设置了默认内存大小而不能够完整展示
SET optimizer_trace="enabled=on",end_markers_in_json=on;
set optimizer_trace_max_mem_size=100000;
执行sql
例子
SELECT * FROM sys_config
最后检查information_schema.optimer_trace就可以知道MYSQL是如何执行SQL的