MySQL对执行计划进行的优化
2020-11-10 本文已影响0人
Franck_
Mysql会对需要执行的SQL进行一个成本计算。然后用计算出来的成本来判断选择什么执行计划。
这个成本有2部分。
- 从磁盘将数据页读取出来的成本值 = 1.0,消耗的是磁盘IO
- 读取和检测一条数据是否符合查询的条件成本值=0.2 ,消耗的是CPU计算
计算一次全表扫描的成本如下: (计算不完全准确,只是表达意思)
1 因为是全表扫描,所以要加载所有的数据页,假设有100个数据页。 那么磁盘IO的总成本大概 = 100 * 1 = 200 。
2 假设这100页的数据有10000条。 那么CPU的总成本值 = 10000 * 0.2 = 2000
那么这次全表扫描的总成本 = 200 + 2000 = 2200。
使用索引进行查询的成本如下:
在二级索引里面查询有以下几个部分:
-
查询范围区间,其实就是查询的条件,例如 name = XX 就是1个区间,age >10 and age < 20就是2个区间。 1个区间的成本 = 1页的成本。 这个成本比较低,一般是个位数。 例如3个条件 = 3
-
估计在二级索引里面筛选的数据条数目, 然后计算CPU成本, 例如 100条 : 100 * 0.2 = 20
-
进行回表,在回表的时候,默认认为1条数据的成本 = 1个数据页的成本 = 1 。例如100条数据回表的成本= 100 * 1 = 100 。
-
回表以后,就可以根据其他条件去筛选最后符合查询的数据,这个成本是CPU成本,假设还是那100条那么成本 = 100 * 0.2 = 20
最后将所有成本加起来就是使用索引进行查询的成本了: 3 + 20 + 100 + 20 = 153。
对比一下全表扫描和索引扫描的成本。差距是很大的。
多表关联查询和单表的查询成本估算方法差不多, 只是要估算多个表的查询成本进行计算。
如果可以使用多个索引的时候,MySql会对几个执行方案进行成本的计算, 选择最低成本的方案来执行。