【SQL】MySQL中的SQL优化、explain执行计划

  • 查看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语句的耗费时长
【SQL】MySQL中的SQL优化、explain执行计划_第1张图片
使用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;

你可能感兴趣的:(sql,mysql,oracle)