赞
踩
mysql找出所有可能用到的索引,每个索引都去计算成本,再和全表扫描的成本对比,决定使用哪个索引或直接走全表。
查找某个表的统计信息,rows字段表示表的记录数,这个值在MyISAM是准确的,在Innodb是一个估计值;data_length字段表示聚簇索引所占空间大小=聚簇索引页数x每页大小
show table status like 'orders'
我们就可以得到聚簇索引的页数=data_length/每页大小(16kb)=data_length/(16*1024)
1.0是成本系数,1.1是一个微调值
0.2是成本系数,1.0是一个微调值
二级索引查询的成本=IO成本+CPU成本
mysql优化器认为索引的扫描区间和读取一个页面是一样的,扫描区间就是使用了索引会扫描B+tree上哪些区间。比如where order_no in (1,2,3)的扫描区间个数就是3
二级索引记录数可在执行计划的rows列看到,mysql是如何计算这个记录数的呢?
回表的成本=IO成本+CPU成本
mysql认为回表时有多少条记录就相当于访问多少个页
总成本=二级索引查询的成本+回表的成本
EXPLAIN select type from orders where order_no > 'K2019050510408' and order_no < 'K2020031050868' -- 221598 range
EXPLAIN select type from orders where order_no > 'K2019050510408' and order_no < 'K2020031151013' -- 221706 ALL
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。