基于成本
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单表查询结果集中的每一条记录
}
}