- 查看SQL执行频率
-- 查看当前会话统计结果
show session status like 'Com_______';
-- 查看自数据库上次启动至今统计结果
show global status like 'Com_______';
- 定位低效率执行SQL
两种定位方式:
1.查看慢查询日志
2.通过show processlist查看所有正在运行的线程 - explain分析执行计划
-- 查询执行计划
explain select * from role r , (select * from user_role ur where ur.uid = (select uid from user where uname = '张飞')) t where r.rid = t.rid
字段 | 含义 |
---|---|
id | id越大优先级越高,越先执行,id相同加载表的顺序从上到下 |
select_type | 表示select的类型 |
table | 输出结果的表 |
type | 表的连接类型 |
possible key | 可能使用的索引 |
key | 实际使用的索引 |
key_len | 索引字段的长度 |
rows | 扫描行的数量 |
extra | 执行情况的说明和描述 |
select_type:
select_type | 含义 |
---|---|
SIMPLE | 简单的select查询,没有子查询或union |
PRIMARY | 主查询,子查询中的最外层查询 |
SUBQUERY | 在select或where里的子查询 |
DERIVED | 在from列表里包含的子查询,被标记为derived(衍生) |
UNION | 第二个select出现在union之后,则标记为union |
UNION RESULT | 从union表获取结果的select |
type:
效率:system > const > eq_ref > ref > range > index > all
type | 含义 |
---|---|
NULL | 没有访问任何表 |
system | 系统表,少量数据;5,7及以上版本显示的是all |
const | 命中主键索引或者唯一索引 |
eq_ref | 左表命中主键索引,且左表每一行对应右表每一行 |
ref | 左表命中非唯一性索引(主键索引和唯一索引都是唯一性索引) |
range | 范围查询,使用between,<,>,in等操作 |
index | 仅扫描索引列的值 |
all | 全表扫描 |
- show profile分析SQL执行时间
-- 查看是否支持profile
select @@have_profiling;
-- 开启profiling开关
set profiling = 1;
执行一系列sql语句后执行show profiles,可用来查看各个SQL语句的耗费时长
使用show profile查询某条SQL语句每个过程的花费时间
-- 用来查看query_id对应的SQL执行过程中,每个过程的花费时间。
show profile for query query_id;
- trace分析优化器执行计划(仅了解)
-- 打开trace,设置格式为json
set optimizer_trace = "enabled=on",end_markers_in_json=on;
-- 设置trace最大可使用的内存
set optimizer_trace_max_men_size = 1000000;
查询trace,知道优化器如何执行的sql
select * from information_schema.optimizer_trace\G;