概述
Mysql查询优化器
- 基于成本
-
- I/O成本
- CPU成本
- join
-
- 连接原理
-
- 嵌套循环连接
- 基于块的嵌套连接
- 外连接
- 子查询优化
-
- in子查询优化
-
- 物化表
- semi-join
-
- Table pullout(子查询中的表上拉)
- DuplicateWeedout execution strategy(重复值消除)
- FirstMatch execution strategy首次匹配
- LooseScan 松散索引扫描
基于成本
Mysql执行一个查询可以有不同的执行方案,它会选择其中成本最低的方案.
主要计算的就是:
- 全表扫描成本
- 针对每个索引计算不同的访问方式的成本
成本其中包括 I/O成本和CPU成本
InnoDB存储引擎规定 读取一个页面花费的成本默认是1.0(I/O成本),读取以及检测一条记录是否符合搜素条件的成本为0.2(CPU成本).
如果是计算辅助索引成本 还会加上 回表成本(因为辅助索引的叶子结点存的是主键而不是真实数据).
I/O成本
InnoDB存储引擎都是将数据和索引都存储到磁盘上的,当我们想查询表中的记录时,需要先把数据或者索引加载到内存中然后再操作。这个从磁盘到内存这个加载的过程损耗的时间称之为I/O成本。
CPU成本
读取以及检测记录是否满足对应的搜索条件 对结果集进行排序等这些操作损耗的时间为CPU成本
join
连接原理
连接的大致原理:
- 选取驱动表,使用与驱动表相关的过滤条件,选取代价最低的访问形式来执行对驱动表的单表查询
- 对上一步骤中查询驱动表得到的结果集中的每一条记录,都分别到被驱动表中查找匹配的记录
对应的伪代码:
for each row in t1{
//遍历满足对t1单表查询结果集中的每一条记录
for each row in t2{
//对某条t1表的记录来说,遍历满足对t2单表查询结果集中的每一条记录
}
}
嵌套循环连接
上面的过程是 驱动表只访问一次,但被驱动表可能被访问多次 这种就是嵌套循环连接
例子:
mysql> select * from t1 join t2 on t1.a = t2.a where t1.b in (1,2);
先会执行:
mysql
最后
以上就是活泼大门为你收集整理的【Mysql】查询优化器基于成本join子查询优化的全部内容,希望文章能够帮你解决【Mysql】查询优化器基于成本join子查询优化所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复