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

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 最近的MySQL8.0.14版本增加了其第一个并行查询特性,可以支持在聚集索引上做SELECT COUNT()和check table操作。本文简单的介绍下这个特性。 用法 增加了一个session级别参数: innodb_parallel_read_threads 要执行并行查询,需要满足如下条.

Update log

2019/7/30: MySQL-8.0.17

相关worklog: WL#12978: InnoDB:Fix imbalance during parallel scan

主要改动:修复了数据倾斜的问题,比如产生了5个分区,但只有4个线程,每个分区执行假设1分钟的话,那么首先4个线程先各自执行自己的分区,然后谁先完成再执行最后一个分区,加起来就是2分钟。解决方案是,当执行最后一个分区时,再把他分成多个subtree, 这样就可以多线程执行最后一个分区

其他:

  1. Phy_reader移除掉了
  2. 创建read-aheader线程去pre-fetch data
  3. innodb_parallel_read_threads最大可以设置到256个线程
                      ###################正文分界线####################

最近的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_mysql
    parallel_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更为强大的并行查询功能。

Reference

WL#11720: InnoDB: Parallel read of index
MySQL 8.0.14: A Road to Parallel Query Execution is Wide Open!

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
存储 关系型数据库 MySQL
MySQL InnoDB数据存储结构
MySQL InnoDB数据存储结构
|
1月前
|
存储 缓存 关系型数据库
MySQL的varchar水真的太深了——InnoDB记录存储结构
varchar(M) 能存多少个字符,为什么提示最大16383?innodb怎么知道varchar真正有多长?记录为NULL,innodb如何处理?某个列数据占用的字节数非常多怎么办?影响每行实际可用空间的因素有哪些?本篇围绕innodb默认行格式dynamic来说说原理。
829 6
MySQL的varchar水真的太深了——InnoDB记录存储结构
|
12天前
|
存储 关系型数据库 MySQL
MySQL引擎对决:深入解析MyISAM和InnoDB的区别
MySQL引擎对决:深入解析MyISAM和InnoDB的区别
28 0
|
2月前
|
SQL 关系型数据库 MySQL
Mysql事务隔离级别和锁特性
Mysql事务隔离级别和锁特性
|
26天前
|
存储 缓存 关系型数据库
MySQL事务的四大特性是如何保证的
在MySQL数据库中还有一种二进制日志,其用来基于时间点的还原及主从复制。从表面上来看其和重做日志非常相似,都是记录了对于数据库操作的日志。但是,从本质上来看有着非常大的不同。
11 1
|
1月前
|
SQL 关系型数据库 MySQL
深入理解MySQL事务特性:保证数据完整性与一致性
深入理解MySQL事务特性:保证数据完整性与一致性
87 1
|
1月前
|
存储 安全 关系型数据库
MySQL 临时表的用法和特性
MySQL 临时表的用法和特性
|
1月前
|
关系型数据库 MySQL 测试技术
数据库专家带你体验PolarDB MySQL版 Serverless的极致弹性特性!
本次基于阿里云瑶池数据库解决方案体验馆,带你体验PolarDB MySQL Serverless形态下的性能压测环境,基于可选择的标准压测工具进行压测,构造弹性场景进行压测,实时动态展示弹性能力、价格和性价比结果,压测环境可开放定制修改、可重复验证。参与活动即有机会获得鼠标、小米打印机、卫衣等精美礼品。
数据库专家带你体验PolarDB MySQL版 Serverless的极致弹性特性!
|
2月前
|
关系型数据库 MySQL 测试技术
数据库专家带你体验PolarDB MySQL版 Serverless的极致弹性特性
本次基于阿里云瑶池数据库解决方案体验馆,带你体验PolarDB MySQL Serverless形态下的性能压测环境,基于可选择的标准压测工具进行压测,构造弹性场景进行压测,实时动态展示弹性能力、价格和性价比结果,压测环境可开放定制修改、可重复验证。参与活动即有机会获得鼠标、小米打印机、卫衣等精美礼品。
|
2月前
|
关系型数据库 MySQL 数据库
MySQL事务得四大特性以及实现原理
MySQL事务得四大特性以及实现原理

相关产品

  • 云数据库 RDS MySQL 版