Mysql——》查询优化器

推荐链接:
    总结——》【Java】
    总结——》【Mysql】
    总结——》【Spring】
    总结——》【SpringBoot】

一、概念

Mysql自带:查询优化器(官网Tracing the Optimizer)

Q:一条 SQL 语句是不是只有一种执行方式?
A:并不是,可以有很多种执行方式的。

Q:如果有这么多种执行方式,这些执行方式怎么得到的?
A:根据查询优化器得到的
1)首先启用优化器的追踪(默认是关闭的)
2)接着执行一个 SQL 语句,优化器会生成执行计划,并且优化器分析的过程已经记录到系统表information_schema.optimizer_trace

Q:最终选择哪一种去执行?根据什么判断标准去选择?
A:Mysql使用 基于开销(cost)的优化器 ,哪个开销最小就用哪个执行计划。

二、作用/目的

1)对sql进行优化

优化类型:

1、多表进行关联时,以哪个表的数据作为基准表
2、多个条件,优先执行哪个条件进行过滤(a=1有300条,b=2有200条,c=3有100条)
3、查询数据,是否直接从索引中取值
4、count()、min()、max,是否直接从索引中取值
5、其他

2)选择最优的执行计划

根据解析树生成不同的 执行计划 ,然后选择一种 最优的执行计划 。
注意:Mysql使用 基于开销(cost)的优化器 ,哪个开销最小就用哪个执行计划。

Q:怎么查询开销?
A:show status like ‘Last_query_cost’; – 代表需要随机读取几个4k的数据页才能完成查找

三、查询优化器的开启、关闭

1、是否开启

enable:是否开启
one_line:是否在一行显示

-- 默认:enabled=off,one_line=off
SHOW VARIABLES LIKE 'optimizer_trace';

2、开启

-- 方法1:开启
SET optimizer_trace="enabled=on";

-- 方法2:开启
SET optimizer_trace="enabled=on,one_line=on";

-- 方法3:开启
set @@session.optimizer_trace='enabled=on,one_line=on';

-- 结果:enabled=on,one_line=on
SHOW VARIABLES LIKE 'optimizer_trace';

注意:开启优化器消耗性能,因为它要把优化分析的结果写到表里面,所以不要轻易开启,或者查看完之后关闭它。

3、关闭

-- 方法1:关闭
SET optimizer_trace="enabled=off";

-- 方法2:关闭
SET optimizer_trace="enabled=off,one_line=off";

-- 结果:enabled=of,one_line=off
SHOW VARIABLES LIKE 'optimizer_trace';

四、查询优化器怎么得到执行计划?

1、开启查询优化器

2、执行sql语句

select * from house_asset.community t1 
left join house_asset.building t2 on t1.community_id = t2.community_id
limit 100;

select * from information_schema.optimizer_trace;

3、查看所有的执行计划

expanded_query:优化过后的sql语句
considered_execution_plans:列出所有的执行计划
在这里插入图片描述
在这里插入图片描述

4、关闭查询优化器

五、查询执行计划

优化器最终会把解析树变成一个查询执行计划(Mysql——》explain执行计划),查询执行计划是一个数据结构。这个执行计划,不一定是最优的执行计划(Mysql也有可能覆盖不到所有的执行计划)

-- 在sql语句前面加上explain关键字
explain
select * from house_asset.community t1 
left join house_asset.building t2 on t1.community_id = t2.community_id
limit 100;

在这里插入图片描述


版权声明:本文为weixin_43453386原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。