1.单表的查询成本计算
mysql查询一条sql的成本,包含IO成本和CPU成本。其中IO成本就是我们读取或者处理数据的时候把数据会从磁盘加载到内存中所用的时间;CPU成本就是数据加载到内存后需要读取以及检测数据记录是不是满足你sql中的对应条件,以及要是涉及到排序的时候需要进行排序这些操作的消耗的时间就是cpu成本。
对于innodb来说,其中读取一页所需要成本为1.0;访问一条记录所需要的cpu成本就是0.2,所以成本计算:(IO页数*1.0+微调数)+(记录数*0.2+微调数)
查看mysql的一条sql的查询成本:
set optimizer_trace='enabled=on';
select * from order where order_no in ('202111081535172900000007','202111111612098550000009','202111151738163880000015')
and order_status='4' and company_id > 6 and company_id <=8;
select * from information.optimizer_trace;
SQL: 其中order_no加上了唯一索引,order_status、company_id加上了普通索引。
select * from order where order_no in ('202111081535172900000007','202111111612098550000009','202111151738163880000015')
and company_id > 6 and company_id <=8;
全表扫描:
IO成本: 8*1.0+1.1(微调数,这个是mysql指定的常数)=9.1
(对于全表扫描的需要读取的页数:show table status like 'vouching_order';可以查询出data_length和row的值,分别为131072和292,可以计算出IO页数131072/16/1024=8页)
CPU成本: 292*0.2+1.0(微调数,这个是mysql指定的常数)=59.4
全表扫描的成本:9.1+59.4=68.5
索引unique_order_no(company_id \order_status和这个一样,只是他们都是一个区间范围):
二级索引成本计算
IO成本:3*1.0=3 (不论某个范围区间有多少个页面,因为二级索引是连续的,顺序IO特别快,一个区间内的顺序IO就相当于一个页的IO操作,所以对于IN来说,三个值相当于3个范围区间的查找,即相当于3个页面的查找)
CPU成本:3*0.2+0.01(微调数)=0.61
回表成本计算
IO成本:3*1.0=3 (对于回表操作来说,加载记录相当于随机IO,所以读取一条记录就相当于读取一页的操作)
CPU成本:3*0.2=0.6
成本:3+0.61+3+0.6=7.21 但是实际上和全表扫描比较成本的时候使用索引的成本会减去读取并检测回表后聚簇索引记录的CPU成本,所以实际上3+0.61+3=6.61,如果比较完成,会再计算一次使用索引的成本,这时就会加上减去的成本了。
网友评论