(1)单表索引的成本计算:
使用索引访问数据的方式,除非直接根据主键查,直接走一个聚簇索引,否则普通索引一般都是两步走:先从二级索引查询一批数据,再根据这批数据的主键去聚簇索引回表查询。
这个过程的成本计算稍微有点特别,在二级索引里根据条件查询一批数据的IO成本,一般看查询条件涉及到几个范围,比如name值在25~100,250~350两个区间,那就是两个范围,否则name=xx就
仅仅是一个范围区间,一般一个范围区间就粗暴的认为等同于一个数据页,所以此时可能一般根据二级索引查询的时候,这个IO成本都会预估的很小,可能就是 11.0=1,或者是n1.0=n,基本都是
个位数级别。
但是这仅仅是通过IO读取了二级索引的数据页而已,仅仅是二级索引读取的IO成本,但是二级索引数据页到内存以后,还得根据搜索条件去拿出来一批数据,拿这批数据的过程就是根据搜索
条件在二级索引里搜索的过程。此时就要估算从二级索引里读取符合条件的数据成本了,还需要估算一下在二级索引里查出多少条数据,这个过程就有些复杂,总之它会根据一个不太准确的算法去估算
一下根据查询条件可能会在二级索引里查多少条数据来。
估算出来以后,比如估算出来100条数据,此时从二级索引里查询数据的CPU成本就是1000.2+微调值,总之就是20左右而已,接着拿到100条数据之后,就得回表到聚簇索引里去查询完整数据,
此时先估算回表到聚簇索引的IO成本,这里比较粗暴的直接默认1条数据就得回表到聚簇索引查询一个数据页,所以100条数据就是100个数据页的IO成本,也就是1001.0+微调值,大致是100左右。
接着因为在二级索引里搜索到的数据是100条,然后通过IO成本最多回表到聚簇索引访问100个数据页之后,就可以拿到这100条数据的完整值,此时针对这100条数据去判断是否符合查询条件,
这里耗费的CPU成本就是 100*0.2+ 微调值 就是20左右。
上面的所有成本加起来 1+20+100+20=141, 这就是使用一个索引进行拆查询的成本的计算方法。
(2)总结:
上面的全表扫描的成本4100左右,这个根据索引查询成本可能就141,所以很多时候使用索引和全表扫描他的成本差距是非常之大的。所以一般就会针对全表扫描和各个索引的成本,都进行估算,
然后比较,选择一个成本最低的执行计划。