推荐链接:
总结——》【Java】
总结——》【Mysql】
总结——》【Redis】
总结——》【Kafka】
总结——》【Spring】
总结——》【SpringBoot】
总结——》【MyBatis、MyBatis-Plus】
总结——》【Linux】
总结——》【MongoDB】
总结——》【Elasticsearch】
Mysql——》查询优化器
一、概念
Mysql自带:查询优化器(官网Tracing the Optimizer)
Q:一条 SQL 语句是不是只有一种执行方式?
A:并不是,可以有很多种执行方式的。
Q:如果有这么多种执行方式,这些执行方式怎么得到的?
A:根据查询优化器得到的
1)首先启用优化器的追踪(默认是关闭的)
2)接着执行一个 SQL 语句,优化器会生成执行计划,并且优化器分析的过程已经记录到系统表information_schema.optimizer_trace
Q:最终选择哪一种去执行?根据什么判断标准去选择?
A:Mysql使用 基于开销(cost)的优化器 ,哪个开销最小就用哪个执行计划。
二、作用/目的
1)对sql进行优化
优化类型:
1、对sql语句做重写:条件化简、常量传递、去除没用的条件
2、多表进行关联时,以哪个表的数据作为基准表
3、将一些外连接转换为内连接
4、对in子查询会进行物化、物化表转连接查询、转换为内连接查询
5、多个条件,优先执行哪个条件进行过滤(a=1有300条,b=2有200条,c=3有100条)
6、索引条件下推,从二级索引取得的索引记录,先做条件判断,如果条件不满足,则该二级索引记录不会去回表,这样可以大量的减少回表操作的随机IO成本。
7、在回表操作上,因为每次执行回表操作时都相当于要随机读取一个聚簇索引页面,而这些随机IO带来的性能开销比较大。MySQL中提出了一个名为Disk-Sweep Multi-Range Read (MRR,多范围读取)的优化措施,即先读取一部分二级索引记录,将它们的主键值排好序之后再统一执行回表操作。