最近的MySQL8.0.14版本增加了其第一个并行查询特性,可以支持在聚集索引上做SELECT COUNT()和check table操作。本文简单的介绍下这个特性。
用法
要执行并行查询,需要满足如下条件(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()
流程: