I/O成本:将数据从磁盘读到内存的成本。
CPU成本 :数据读到内存后过滤、排序得到满足条件数据的成本。
总成本 =I/O成本+CPU成本
注意:对于InnoDB存储引擎来说,页是磁盘和内存之间交互的基本单位,MySQL规定读取一个页 面花费的成本默认是1.0,读取以及检测一条记录是否符合搜索条件的成本默认是0.2。 1.0、0.2这些数字称之为成本常数,这两个成本常数我们最常用到,当然还有其他的成本常数。
查看mysql执行所有可能途径使用的成本1. 开启trace工具来一查究竟,开启trace工具会影响mysql性能,所以只能临时分析sql使用,用完之后立即关闭,具体方法参考:Mysql索引优化实战一_季风泯灭的季节的博客-CSDN博客
2. 使用explain查看,在explain后面加上 format=json 即可。
explain format=json SELECT * from test5
单表查询的成本
计算成本的过程
1、根据搜索条件,找出所有可能使用的索引
2、计算全表扫描的代价
3、计算使用不同索引执行查询的代价
4、对比各种执行方案的代价,找出成本最低的那一个
全表扫描的代价
I/O成本=总页数*1.0+1.1
CPU成本 =总记录数*0.2+1.0
数据库表都维护了总记录数,
InnoDB是一个估算的值,MYISAM是一个准确的值。通过SHOW TABLE STATUS 命令可以查到。总页数则用表的总大小➗16➗1024得到。
二级索引的代价
1. 使用二级索引的成本
如果是范围查询则算一次IO,因为它属于顺序IO。如果是精准查询则有几个就是几次IO,因为它是随机IO.顺序IO的效率大概是随机IO的40-400倍。如 in(1,3)就是两次IO。二级索引的成本如下:
I/O成本=总页数*1.0
CPU成本 =总记录数*0.2+0.012. 回表的代价
mysql需先计算出要回表的记录数,如果总记录数小于10页,则精准计算,如果大于10页,则以前10页的平均记录数X页数(页数从父节点的关键字数统计得出)进行估算。
I/O成本=总记录数*1.0
多表连接的成本与两表连接类似,只是后一个表以前面的sql查询结果为扇出去查询,其查询性能消耗为 n!,同时,mysql在sql分析阶段付出的成本也是n!。因此,它的表越多性能越差。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)