MySQL8.0.14 - 新特性 - InnoDB Parallel Read简述

最近的MySQL8.0.14版本增加了其第一个并行查询特性,可以支持在聚集索引上做SELECT COUNT()和check table操作。本文简单的介绍下这个特性。

用法

增加了一个session级别参数: innodb_parallel_read_threads

要执行并行查询,需要满足如下条件(ref: row_scan_index_for_mysql)

  • 无锁查询
  • 聚集索引
  • 不是Insert...select
  • 需要参数设置为>1

相关代码

入口函数:

row_scan_index_for_mysqlparallel_select_count_star  // for select count(*)parallel_check_table        // for check table

InnoDB里实现了两种查询方式,一种是基于key的(key reader), 根据叶子节点上的值做分区,需要判断可见性;另外一种是基于page的(physical read),根据page no来做分区,无需判断可见性。目前支持的两种查询都是key reader的方式。

使用如下代码创建一个reader,并调用接口函数,read()函数里的回调函数包含了如何对获取到的行数据进行处理:

Key_reader reader(prebuilt->table, trx, index, prebuilt, n_threads);
reader.read(func), 其中func是回调函数,用于告诉线程怎么处理得到的每一行

分区并计算线程数

分区入口:

template <typename T, typename R>
typename Reader<T, R>::Ranges Reader<T, R>::partition()

流程:

  • 搜集btree的最左节点page no
  • 从root page开始向下,尝试构建子树:

    • 如果该level的page个数不足线程数,继续往下走
    • 否则,使用该level, 搜集该level的每个page的最左记录向下直到叶子节点的最左链表
  • 如上搜集到的是多条代表自上而下的page no数组,需要根据这些数组创建分区range,这里有两种创建方式:

    • Key_reader::Ranges Key_reader::create_ranges: 基于键值创建分区

      • 找到每个链表的叶子节点的第一条记录,存储其cursor作为当前range的起点和上一个range的终点
    • Phy_reader::Ranges Phy_reader::create_ranges:基于物理页创建分区

      • 找到每个链表的叶子节点,相邻链表的叶子节点组成一个range

线程数取分区数和配置线程数的最小值

启动线程

启动线程各自扫描: start_parallel_load

为每个分区创建context(class Reader::Ctx),加入到队列中
实现了一个Lock-free的队列模型,多线程可以并发的从队列中取context: 实现细节在文件include/ut0mpmcbq.h中,对应类 class mpmc_bq, 实现思路见链接

线程函数:

dberr_t Reader<T, R>::worker(size_t id, Queue &ctxq, Function &f)

每取一个分区,调用处理函数去遍历分区:

  • Key_reader::traverse
    对于获得的每条记录,判断其可见性(共享事务对象trx_t),调用回调函数处理记录(在Key_reader::read()作为参数传递),对于select count(*), 就是累加记录的计数器
  • Phy_reader::traverse
    读取每条非标记删除的记录并调用回调函数处理,无需判断可见性

对于异常情况,只返回最后一个context的错误码。

该特性只是MySQL在并行查询的第一步,甚至定义了一些接口还没有使用,例如接口函数pread_adapter_scan_get_num_threads, 估计是给未来server层做并行查询使用的。代码里对应两个适配类:

  • Parallel_reader_adapter
  • Parallel_partition_reader_adapter

另外一个可以用到的地方是创建二级索引,我们知道InnoDB创建二级索引,是先从聚集索引读取记录,生成多个merge file,然后再做归并排序,但无论是生成merge file,还是排序,都可以做到并行化。官方也提到这是未来的一个优化点,相信不久的将来,我们就能看到MySQL更为强大的并行查询功能。

#阿里云开年Hi购季#幸运抽好礼!
点此抽奖:https://www.aliyun.com/acts/product-section-2019/yq-lottery?utm_content=g_1000042901

原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/519687.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Google 插件总览

有道翻译 Vue.js devtools bilibili哔哩哔哩下载助手 哔哩哔哩助手&#xff1a;bilibili.com 综合辅助扩展 提供方&#xff1a;https://bilibili-helper.github.io Infinity 新标签页 (Pro) Google 翻译 PostWoman Http接口调试插件 jsonView jsonViewer json formatter 格…

java计算增长率

**计算月增长率**//sameMonth 本月金额//lastMonth 上月金额public static String getAnalysisData(Float sameMonth, Float lastMonth) {if (lastMonth < sameMonth) {//如果下个数大于上个数&#xff0c;则增长率 为 正float result (sameMonth - lastMonth) / lastMonth…

详解CPU几个重点基础知识

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 骏马金龙责编 | 阿秃关于CPU和程序的执行1、程序的运行过程&#xff0c;实际上是程序涉及到的、未涉及到的一大堆的指令的执行过程。当程序要执行的部分被装载到内存后&#xff0c;CPU要从内存中取出指令&#xff0c;然后指令…

Spring Cloud Alibaba迁移指南(三):极简的 Config

自 Spring Cloud 官方宣布 Spring Cloud Netflix 进入维护状态后&#xff0c;我们开始制作《Spring Cloud Alibaba迁移指南》系列文章&#xff0c;向开发者提供更多的技术选型方案&#xff0c;并降低迁移过程中的技术难度。 第一篇&#xff1a;一行代码从 Hystrix 迁移到 Sent…

非web项目并且项目文件多java项目 使用tomcat发布的方式

文章目录1. 创建配置文件2. 新建一个web项目2. 新项目结构调整4. 项目结构整理5. 添加jdk和jar6. 等待编译1. 创建配置文件 在tomcat的cof下面创建一下目录 conf\Catalina\localhost这个xml文件的名称建议和项目名一样&#xff0c;作用是&#xff0c;浏览器访问的时候项目名称…

为拯救爸妈朋友圈,达摩院造了“谣言粉碎机”

生命不可能从谎言中开出灿烂的鲜花。 前几天&#xff0c;母上大人给我发了条消息&#xff0c;再三叮嘱帮忙扩散&#xff0c;随手解救癌症患者。 “速转&#xff01;科学家发现&#xff1a;一味中药48小时可杀死60%癌细胞!” 回复框里&#xff0c;我打了一段长长的反驳文字。…

亲历!不要痴迷蓝牙耳机了,出门选这个准没错,99W+人的选择

01有一种耳机啊它是真的不适合在长途火车上使用那就蓝牙耳机除非你带充电宝还有一种耳机啊它是真的不适合丢那就是带有充电仓的耳机因为充电仓丢了这个耳机基本上就废了02这不&#xff0c;我就经历了&#xff0c;活生生的例子出差的路上在火车上把耳机充电仓给弄丢了只剩孤零零…

Spring Cloud Alibaba迁移指南(四):零代码兼容 Api-Gateway

自 Spring Cloud 官方宣布 Spring Cloud Netflix 进入维护状态后&#xff0c;我们开始制作《Spring Cloud Alibaba迁移指南》系列文章&#xff0c;向开发者提供更多的技术选型方案&#xff0c;并降低迁移过程中的技术难度。 第一篇&#xff1a;一行代码从 Hystrix 迁移到 Sent…

调整eclipse、SpringToolSuite4编辑器的内存大小以及显示

我们的Eclipse、SpringToolSuite4编辑器总是会因为内存太小发生卡顿或者卡死现象&#xff0c;我给大家提供一个方法来解决&#xff0c;希望能在这里帮到大家&#xff0c;谢谢&#xff01;&#xff01;&#xff01; 设置内存大小 修改Eclipse的配置文件&#xff1a; 打开Eclip…

一元享移动怎么样_中国移动放大招!月租9元享200GB流量,网友:这套路谁敢用?...

中国移动放大招&#xff01;月租9元享200GB流量&#xff0c;网友&#xff1a;这套路谁敢用&#xff1f;众所周知&#xff0c;自从携号转网政策实施以来&#xff0c;移动就面临巨大的压力&#xff0c;因为口碑相对最差&#xff0c;移动转出的用户是最多的&#xff0c;2个月时间就…

如何制作可以在 MaxCompute 上使用的 crcmod

之前我们介绍过在 PyODPS DataFrame 中使用三方包。对于二进制包而言&#xff0c;MaxCompute 要求使用包名包含 cp27-cp27m 的 Wheel 包。但对于部分长时间未更新的包&#xff0c;例如 oss2 依赖的 crcmod&#xff0c;PyPI 并未提供 Wheel 包&#xff0c;因而需要自行打包。本文…

java解决导出word用wps打开正常,用office打开是html的标签的问题

如题&#xff0c;做导出word时遇到了这样的问题&#xff0c;用office打开是html标签&#xff0c;wps却是正常的&#xff0c;排查后发现.ftl模板里面首尾没有html标签&#xff0c;加上<html</html>>以后就好了。

云+X案例展 | 传播类:富通云腾加速联通云数字化转型步伐

本案例由富通云腾投递并参与评选&#xff0c;CSDN云计算独家全网首发&#xff1b;更多关于【云X 案例征集】的相关信息&#xff0c;点击了解详情丨挖掘展现更多优秀案例&#xff0c;为不同行业领域带来启迪&#xff0c;进而推动整个“云行业”的健康发展。在云时代背景下&#…

UI2Code智能生成Flutter代码——版面分析篇

开篇: 在《UI2CODE--整体设计》篇中&#xff0c;我们提到UI2CODE工程的第一步是版面分析&#xff0c;如果是白色的简单背景&#xff0c;我们可以像切西瓜一样&#xff0c;将图片信息切割为GUI元素。但是在实际生产过程中&#xff0c;UI的复杂度会高很多。本篇我们将围绕版面分析…

qq互动视频页面加载失败_互动案例技术分析(2)

这是该系列文章的第2篇&#xff0c;我们仍然会选择三个互动营销案例&#xff0c;从技术角度加以分析。这个系列并非为程序员而写&#xff0c;因为这些内容就是我们的日常工作。我们的目标是让更多的朋友能够了解技术可以实现的效果&#xff0c;以及更重要的——不能实现的效果。…

安排!活动素材的亿级用户精准投放

1.背景 随着闲鱼用户快速增长&#xff0c;运营活动越来越趋于精细和个性化&#xff0c;运营会根据用户偏好为其投放合适的活动&#xff0c;如下图所示在闲鱼首页商品展示时&#xff0c;会在商品的列表中插入活动Banner&#xff0c;通过这些活动banner引导用户进入到相应活动会场…

mysql计算年增长率

数据库格式如下&#xff1a; SELECTt1.YEAR,t1.quantity / t2.quantity increase_rate FROMyear_sales t1INNER JOIN year_sales t2 ON t1.YEAR - 1 t2.YEAR结果如下

云+X案例展 | 传播类:九州云 SD-WAN 携手上海电信,助力政企客户网络重构 换新颜

本案例由九州云腾投递并参与评选&#xff0c;CSDN云计算独家全网首发&#xff1b;更多关于【云X 案例征集】的相关信息&#xff0c;点击了解详情丨挖掘展现更多优秀案例&#xff0c;为不同行业领域带来启迪&#xff0c;进而推动整个“云行业”的健康发展。随着网络技术快速发展…

刚刚,阿里开源 iOS 协程开发框架 coobjc!

刚刚&#xff0c;阿里巴巴正式对外开源了基于 Apache 2.0 协议的协程开发框架 coobjc&#xff0c;开发者们可以在 Github 上自主下载。 coobjc是为iOS平台打造的开源协程开发框架&#xff0c;支持Objective-C和Swift&#xff0c;同时提供了cokit库为Foundation和UIKit中的部分A…