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

Reference

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



本文作者:zhaiwx_yinfeng.

阅读原文

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

MySQL8.0.14 - 新特性 - InnoDB Parallel Read简述 1相关推荐

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

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

  2. MySQL8.0索引新特性:颠覆了我对索引的认知

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:http://dbapub.cn/ 函数索引 在MySQL8.0之前对条件字段做函数操作.或者做运算都将不会使用字段上的索引, ...

  3. mysql8.0 的新特性_What's New In MySQL 8.0(MySQL 8.0 新特性)

    由于8.0内有很多C++11特性.需要gcc4.8版本以上.Rhel6系列默认gcc是4.7.在安装gcc6.1之后仍然检查不过. 原因可能是6.1版本不一定高于4.7,暂不讨论.鉴于升级gcc耗时较 ...

  4. MySQL-8.0.x 新特性之索引页合并

    [背景] 索引的重要是在些不表.在这里我想说的另一个问题:索引和数据一样在innodb中都是以page的形式来组织的,那么问题就来了. 比如果说索引 ix_person_name 的内容只要8个页面就 ...

  5. mysql8.0 的新特性_MySQL8.0-新特性汇总

    大量使用 class 重构代码 明面上: 提高了代码安全性.可维护性,优化继承关系,提高可读性 小算盘: 第三方的开源分支受重创,难以跟上8.0的代码结构 DDL重做原子性秒加列 官方文档: http ...

  6. 七、Java 14 新特性

    七.Java 14 新特性 Java 14 已如期于 2020 年 3 月 17 日正式发布,此次更新是继半年前 Java 13 这大版本发布之后的又一次常规版本更新,即便在全球疫情如此严峻形势下,依 ...

  7. .NET 4.0 Interop新特性ICustomQueryInterface (转载)

    .NET 4.0 Interop新特性ICustomQueryInterface 在.NET Framework v4.0发布的新功能中,在名字空间System.Runtime.InteropServ ...

  8. 安卓9.0系统新特性

    安卓9.0系统新特性 新特性一: 日前针对Android系统特有的开放式特点,及其所带来的卡顿.运行不流畅问题,谷歌特意研制出最新版Android 9.0,以增强系统的封闭性.于是,网上曝出了很多安卓 ...

  9. Android O(SDK 8.0)新特性,刘海屏

    > Android刘海屏 Android 屏幕,16:9,17:9,19:10,18:9,18.5:9所谓全面屏.挖孔屏.凹凸屏等. android 全面屏/刘海屏有效适配- https://b ...

最新文章

  1. 如何理解Nyquist采样定理?
  2. everything文件搜索_本地文件搜索神器,Everything、Listary、AnyTXT Searcher!
  3. oracle设计自增列,oracle中实现自增列
  4. 基于ZXing的二维码,你可以这样改造它
  5. VTK:Shaders之CubeMap
  6. quick-cocos2d-x api构建文档
  7. 高等数学下-赵立军-北京大学出版社-题解-练习11.3
  8. shell循环读文件 Linux脚本读文件
  9. sqlserver2008_是时候挥别 SQL Server 2008 了
  10. 新型安卓木马SpyNote生成器遭泄露
  11. 计算机随机储存器是什么,随机存储器是什么
  12. HDU-6287 口算训练(想法题)
  13. 服务器系统补丁失败,windows server 2008更新补丁失败排错
  14. clion:输出中文乱码终极解决方案
  15. golang rabbitMQ 生产者复用channel以及生产者组分发策略
  16. 【自然语言处理】词袋模型在文本分类中的用法
  17. 2022年网络工程师考试知识点:防火墙技术
  18. Efficient Image Dehazing with Boundary Constraint and Contextual Regularization
  19. Windows下安装Redis及可视化工具
  20. 远程连接docker中的SQL Server

热门文章

  1. 关于这个错误的不明原因的解决之道
  2. js返回上级页面的方法(亲测)
  3. shell基础--字符串和变量的操作
  4. 一大波Java来袭(四)String类、StringBuilder类、StringBuffer类对照
  5. DotNetBar 教程
  6. C+++之begin(),end(),rend(),rbegin()
  7. python函数定义语法_python 函数基础 定义
  8. centos7安装rabbitmq_rabbitmq v3.7.16安装部署文档
  9. 键盘定位板图纸_罗技K750 SOLAR太阳能无线键盘评测
  10. 解压出来的文件md5会改变吗_监控Linux文件变化,防止系统被黑