深入解析:从源码窥探MySQL优化器

  • 时间:
  • 浏览:2
  • 来源:uu快3网站_uu快3充值_玩法

表film_actor中索引idx_id(film_id)统计信息如下:

4 #define COND_FILTER_EQUALITY 0.1f

从磁盘读取有另好多个 多Page的代价

select * from sakila.actor;

1 #define ROW_EVALUATE_COST 0.2f

02优化器参数

6 #define COND_FILTER_BETWEEN 0.1111f

非等值过滤条件的默认值是0.3333,类事col1>col2

......

MySQL的优化器对于Oracle来说还显得比较幼稚。Oracle有着各种宽裕的统计信息,比如系可是我 计信息,表统计信息,索引统计信息等,而MySQL则时要更多的常量,其中MySQL5.7提供了表mysql.server_cost和表mysql.engine_cost,都上能供用户配置,使得用户并能调整优化器模型,下面就好多个常见而又非常重要的参数进行介绍:

03 优化器选项

41+500.66+50015.47102,其含高另好多个 多1分别表示过滤因子,可能有另好多个 多表均没人 过滤条件但是 过滤因子都在1。

在流程图中的函数中,处在多量如下代码:

原文发布时间为:2018-12-16

本文作者: 汤爱中

本文来自云栖社区合作伙伴“ 数据和云”,了解相关信息都上能关注“OraNews”微信公众号

1 根据语法树及统计统计,构建初始表访问数组(init_plan_arrays)

2 根据表访问数组,计算每个表的最佳访问路径(find_best_ref),一起去保存当前最优执行计划(COST最小)

5 #define COND_FILTER_INEQUALITY 0.3333f

read_cost(204.67) =prefix_rowcount (1 + keys_per_value/table_rowscluster_index_size =

16K/2/(索引长度+主键长度(注:二级索引存储的是主键的引用))=16K/2/(2+4)+1=1366,

3 可能找到更优的执行计划则更新最优执行计划,但是 优化但是但是刚开始英文。

04 Optimize Trace是要怎样生成的?

Between过滤的默认值是0.1111f,类事:col1 between a and b



从上图都上能看出,FirstMatch是通过判断记录不是可能在结果集中处在来减少查询和匹配流程。

2 #define IO_BLOCK_READ_COST 1.0f



上图展示了优化器的大致执行过程,都上能简单描述为:

Opt_trace_object trace_ls(trace, "searching_loose_scan_index");

从内存读取有另好多个 多Page的代价,对于Innodb来说,表示从有另好多个 多Buffer Pool读取有另好多个 多Page的代价,但是 读取内存页和磁盘页的默认代价是一样的

表actor统计信息如下:



执行计划:

在MySQL中,执行select @@optimizer_trace, 得到如下参数:

SQL如下:

以上代码是在有另好多个 多for循环中递归搜索,这是有另好多个 多典型的全排列的算法。

从上述流程都上能看出,执行计划的生成是有另好多个 多“动态规划/贪心算法”的过程,动态规划公式都上能表示为:Min(Cost(Tn+1)) = Min(Cost(T1))+Min(Cost(T2))+...Min(Cost(Tn-1))+Min(Cost(Tn)),其中Cost(Tn)表示访问表T1 T2一个劲到Tn的代价。可能优化器没人 任何先验知识,则时要进行 A(n,n) 次循环,是有另好多个 多全排列过程,很显然优化器是有先验知识的,如表大小,外连接,子查询等都在使得表的访问是次要有序的,都上能理解为有另好多个 多“被裁减”的动态规划,动态规则的核心函数为:Join::Best_extention_limited_search,在源码含高如下代码形态:

索引块大小为16K,但是 MySQL假设块都在半满的,则有另好多个 多块并能存放的索引记录数为:

Table_rows是要怎样计算的呢?

等值过滤条件默认值为0.1,类事name = ‘lily’, 表大小为5000,则返回10行数据

参考函数double handler::index_only_read_time(uint keynr, double records)

表连接返回行数=5005462/500,但是 行估算代价为54620.2=1902.4

其中主键为(actor_id,film_id),有另好多个 多字段都在smallint,占用有另好多个 多字节,而索引idx_id(film_id)是有另好多个 多字节,但是 每次访问索引的代价为:(5.47+1366-1)/1366 = 1.0032, 访问film_actor表一共时要500次,总访问代价为:500*1.0032=500.66

第3个表可是我 NET LOOP 代价:

计算符合条件的行的代价,行数过多,代价越大

5.3 IN查询

另另好多个 多的常量可是我 ,涉及到过滤条件、JOIN缓存、临时表等等各种代价,理解哪些地方地方常量后,看一遍执行计划的Cost后,但是有种豁然开朗的感觉!

但是 ,在优化器运行过程中,优化器的执行路径也被保处在Opt_trace_object中,进而保处在information_schema.optimizer_trace中,方便用户查询和跟踪。

5.2 表连接时使用全表扫描

总代价4500.79 = 表actor的访问代价+表film_actor访问代价+行估算代价=

3 #define MEMORY_BLOCK_READ_COST 1.0f

05 优化器的典型使用场景

500 (1+27/1386312)*1

Film_actor表的实际记录数是5462,一共1有另好多个 多page,1有另好多个 多叶子页,总大小为1116K(默认页大小)=1500224Byte, 最小记录长度为26(通过计算字段长度可得),13863 = 1500224/262, 2是安全因子,做最差的代价估计。

表film_actor表的访问代价500.66是要怎样计算的呢?

5.1 全表扫描

从执行计划中都上能看出,MySQL采用FirstMatch措施。在MySQL中,半链接优化措施为:Materialization Strategy,LooseScan,FirstMatch,DuplicateWeedout,默认状态下这一优化措施都在处在的,选折 措施基于最小COST。现在大家 以FirstMatch为例,讲解优化器的执行流程。

第一张表actor的全表扫代价为41,都上能参考示例1。

访问表film_actor中索引字段film_id,MySQL会走覆盖索引扫,即IDEX_ONLY_SCAN,一次索引访问的代价是要怎样计算的呢?

表actor的访问代价都上能参考示例1.

注意:27 相当于对于每个actor_id,film_actor的索引估计,对于每个actor_id,平均有27条记录=5462/500

注意以上过程忽略了内存页和磁盘页的访问代价差异。

猜你喜欢

三星w2018组装机多少钱!

可选中两个 或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。提示:请各位消费者在收到这种于中奖或极低价格购机信息时谨慎对待,补救上当受骗。使用百度知

2020-03-22

王者荣耀拒绝了一次人脸识别,时候不弹出,每天只能玩一个小时,已成年,卸载重下已经试过了

使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。追问不怎么推荐不采纳的全是蔡徐坤。你对你这人 回答的评价是?追答收起更多回答(6)你对你这人 回答的

2020-03-22

网宿科技孙靖泽:CDN规模门槛为5T,整合潮年底就会出现

业内人士认为,CDN行业是另另四个靠规模取胜的行业,原因分析分析手里的服务器和强度很多,能应对的峰值就越高,越来越 也就更有能力做更大的客户。这几年随着市场需求的不断扩大,以

2020-03-22

OPPO哪一款手机比较好

换一换下载百度知道APP,抢鲜体验展开完正扫描二维码下载其他人刚买了oppor15,用了有另一有一个月了,感觉手感比较好,因此 运行传输数率还能要能,外观也比较好看,拿起来

2020-03-21

阿里云数据库资深专家林伟:大规模计算平台研究与实战

【云栖大会】高可用、高并发、高性能架构实战经验昨夜难忘?今晚20点,容器、后面 件、负载均衡等实战交流继续!进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。

2020-03-21