mysql 代价

mysql cbo cost base optimizer 基于代价,数据是一直变化的
oracle8 以前是rbo rule base optimizer 基于规则, 如果sql使用了索引,必须使用索引,尽管全表扫描比索引快

代价= cpu cost + io cost
1)计算全表扫描代价
  a)cpu cost
    (double) records / TIME_FOR_COMPARE + 1
    records为表会统计的所有记录个数
    TIME_FOR_COMPARE 为5,即CPU每比较5条记录,计1个cost, 是mysql层统计
  b)io cost
    (double) (prebuilt->table->stat_clustered_index_size
    聚簇索引叶页面数

2)索引范围扫描代价
  a)主键,唯一索引 io cost
    a1)cpu cost
      范围查找估算的记录/TIME_FOR_COMPARE+1
    a2)io cost
      (range+row)/(总记录/聚焦索引的页面数)
      通过范围查找,估算出有100条记录,总记录500条,共有20个page
      那么一个page能装载500/20=25条记录,那100条记录 需要 100/25=4条记录来装载
  b)二级索引覆盖索引
    b1)cpu cost
      范围查找估算的记录数/TIME_FOR_COMPARE+1
    b2)io cost
      范围查找估算的记录数/keys_per_page
  c)二级索引 非覆盖索引
    c1)cpu cost
      范围查找估算的记录数/TIME_FOR_COMPARE+1
    c2)io cost
      范围查找估算的记录数, 需要回表,但可能对应的主键有若干个在同一个page

 

 

关于mysql cost 成本的计算方式,感觉计算过程是不太合理的,也常常是不精确的,计算结果倾向于进

行全表扫描,在mysql 中,cost 成本模型是分别计算cpu cost 和io cost,然后把两者相加而得到最终的

总成本, 并没有考虑到CPU&IO 的权重因素、机器CPU 实际处理速度、 IO 的实际能力和当前的负载等因素,

对这块的统计数据也没有收集操作。

 

公式简要说明如下:

单表时:

COST = io_cost + cpu_cost;

| |

| |

V V

read_time + found_records / (double) TIME_FOR_COMPARE==5

其中的read_time 和found_records 计算过程按不同的type 如下:

当type 为:

system & const: //const_tab

{

found_records=read_time=1;

}

当type 为:

Index : //covering index

{

uint keys_per_block= (index_block_size/2/key_len) + 1); //块一半满,除以键长度

read_time=((double) (records+keys_per_block-1)/(double) keys_per_block);

found_records = ranges 区间扫描得到的总行数;(当存储引擎不支持index filter 时,

为下行扇出的记录条数和)

}

当type 为:

Ref_[OR_null]: //ref

{

read_time = found_records + ranges;

found_records = ranges 区间扫描得到的总行数; (当存储引擎不支持index filter 时,

为下行扇出的记录条数和)

}

DEFAULT:(type 其实为all)

found_records=全表记录;

read_time= 全索引pages 数目;

join时为:

总cost= 前表cost + 后表cost * 前表found_records

(采用贪婪算法,找出谁先谁后顺序进行join.)

估算card 时,部分动作可以触发统计信息的收集,包括analyze、show table status 等,在innodb

中为8 个分散索引块扫描后计算得到的,也看到有人改为用64 块进行统计信息的收集,同时关闭参数

innodb_stats_method,以保证执行计划的稳定性。

 

转载于:https://www.cnblogs.com/taek/p/6580235.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值