我是靠谱客的博主 活泼大门,最近开发中收集的这篇文章主要介绍【Mysql】查询优化器基于成本join子查询优化,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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子查询优化所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(33)

评论列表共有 0 条评论

立即
投稿
返回
顶部