在MySQL
中,,一个查询的执行成本是由I/O
成本和CPU
成本组成的,对于InnoDB
存储引擎来说,读取一个页面的I/O
成本默认是1.0
,读取以及检测一条记录是否符合搜素条件的成本默认是0.2
。
在单表查询中,优化器生成执行计划的步骤一般如下。
- 步骤1.根据搜索条件,找出所有可能使用的索引。
- 步骤2.计算全表扫描的代价。
- 步骤3.计算使用不同索引执行查询的代价。
- 步骤4.对比各种执行方案的代价,找出成本最低的那个方案。
在优化器生成执行计划的过程中,需要依赖一些数据,这些数据可能是使用下面两种方式得到的:
index dive
:通过直接访问索引对应的B+树来获取数据。- 索引统计数据:直接依赖对表或者索引的统计数据。
为了更准确地计算连接查询的成本,会采用某些规则来预测驱动表的扇出值。
连接查询总成本=单次访问驱动表的成本+驱动表扇出值*单次访问被驱动表的成本
对于左连接和右连接来说,它们的驱动表是固定的,所以只需要分别为驱动表和被驱动表选择成本最低的访问方法,就可以找到最优的查询方案。
对于内连接来说,为了生成成本最低的执行计划,需要考虑两方面:
- 选择最优的表连接顺序。
- 为驱动表和被驱动表选择成本最低的访问方法。
我们可以通过手动修改mysql数据库下
engine_cost
表或者server_cost
表中的某些成本常数,更精准地控制在生成执行计划是的成本计算过程。