博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL8.0.14 - 新特性 - InnoDB Parallel Read简述
阅读量:7242 次
发布时间:2019-06-29

本文共 1994 字,大约阅读时间需要 6 分钟。

hot3.png

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

用法

增加了一个session级别参数: 

要执行并行查询,需要满足如下条件(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 Reader
::Ranges Reader
::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
::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

转载于:https://my.oschina.net/u/1464083/blog/3016053

你可能感兴趣的文章
37.6. slb
查看>>
【逻辑思考】拥有我的知识库是怎样一种感受?
查看>>
Android开发之旅:应用程序基础及组件
查看>>
[蓝牙] 4、Heart Rate Service module
查看>>
[ACM_水题] ZOJ 3714 [Java Beans 环中连续m个数最大值]
查看>>
在ie8下ext显示的问题
查看>>
Android Studio 没有assets目录的问题
查看>>
EReference的containment和container属性
查看>>
OceanBase 互联网时代的关系数据库实践
查看>>
【微信公众号发红包转账】微信公众号上手机网页接收请求,通过公众号给用户发红包 开发流程...
查看>>
[LeetCode] Rectangle Area
查看>>
[Erlang 0029] Erlang Inline编译
查看>>
MongoDB学习笔记~自己封装的Curd操作(按需更新的先决条件)
查看>>
【趣事】一根网线发起的攻击
查看>>
百度地图 判断marker是否在多边形内
查看>>
23.6. 路由配置
查看>>
Lind.DDD.UoW~方法回调完成原子化操作
查看>>
Android 中文 API (35) —— ImageSwitcher
查看>>
弹出框封装
查看>>
github for windows 桌面版使用方法
查看>>