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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 最近的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!

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
JSON 关系型数据库 MySQL
MySQL 8.0 新特性
MySQL 8.0 新特性
135 10
MySQL 8.0 新特性
|
2月前
|
存储 Oracle 关系型数据库
Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
从基本特性、技术选型、字段类型、事务提交方式、SQL语句、分页方法等方面对比Oracle和MySQL的区别。
433 18
Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
|
1月前
|
SQL 安全 关系型数据库
MySQL8.2有哪些新特性?
【10月更文挑战第3天】MySQL8.2有哪些新特性?
34 2
|
1月前
|
存储 缓存 关系型数据库
详细解析MySQL中的innodb和myisam
总之,InnoDB和MyISAM各有千秋,选择合适的存储引擎应基于对应用程序特性的深入理解,以及对性能、数据完整性和可扩展性的综合考量。随着技术发展,InnoDB因其全面的功能和日益优化的性能,逐渐成为更广泛场景下的首选。然而,在特定条件下,MyISAM依然保留其独特的价值。
101 0
|
3月前
|
监控 关系型数据库 MySQL
在Linux中,mysql的innodb如何定位锁问题?
在Linux中,mysql的innodb如何定位锁问题?
|
3月前
|
SQL 存储 关系型数据库
"MySQL增列必锁表?揭秘InnoDB在线DDL,让你的数据库操作飞一般,性能无忧!"
【8月更文挑战第11天】在数据库领域,MySQL凭借其稳定高效的表现深受开发者喜爱。对于是否会在给数据表添加列时锁表的问题,MySQL的行为受版本、存储引擎等因素影响。从5.6版起,InnoDB支持在线DDL,可在改动表结构时保持表的可访问性,避免长时间锁表。而MyISAM等则需锁表完成操作。例如,在使用InnoDB的表上运行`ALTER TABLE users ADD COLUMN email VARCHAR(255);`时,通常不会完全锁表。虽然在线DDL提高了灵活性,但复杂操作或大表变更仍可能暂时影响性能。因此,进行结构变更前应评估其影响并择机执行。
70 6
|
3月前
|
算法 关系型数据库 MySQL
一天五道Java面试题----第七天(mysql索引结构,各自的优劣--------->事务的基本特性和隔离级别)
这篇文章是关于MySQL的面试题总结,包括索引结构的优劣、索引设计原则、MySQL锁的类型、执行计划的解读以及事务的基本特性和隔离级别。
|
3月前
|
SQL 算法 关系型数据库
(二十)MySQL特性篇:2022年的我们,必须要懂的那些数据库新技术!
 MySQL数据库从1995年诞生至今,已经过去了二十多个年头了,到2022.04.26日为止,MySQL8.0.29正式发行了GA版本,在此之前版本也发生了多次迭代,发行了大大小小N多个版本,其中每个版本中都有各自的新特性,所有版本的特性加起来,用一本书的篇幅也无法完全阐述清楚,因此本章主要会挑重点特性来讲,具体各版本的特性可参考MySQL官网的开发手册。
135 1
|
4月前
|
存储 SQL 关系型数据库
(十三)MySQL引擎篇:半道出家的InnoDB为何能替换官方的MyISAM?
MySQL是一款支持拔插式引擎的数据库,在开发过程中你可以根据业务特性,从支持的诸多引擎中选择一款适合的,例如MyISAM、InnoDB、Merge、Memory(HEAP)、BDB(BerkeleyDB)、Example、Federated、Archive、CSV、Blackhole.....
|
4月前
|
存储 关系型数据库 MySQL
MySQL InnoDB存储引擎的优点有哪些?
上述提到的特性和优势使得InnoDB引擎非常适合那些要求高可靠性、高性能和事务支持的场景。在使用MySQL进行数据管理时,InnoDB通常是优先考虑的存储引擎选项。
166 0

相关产品

  • 云数据库 RDS MySQL 版