Multi Range Read 代码路径

简介:
所谓MRR,简单的说就是当使用二级索引进行检索并且查询的列需要回表时,先根据检索到的PK值进行排序,然后再回表依次查询聚集索引,从而避免过多的随机IO。

测试示例:
创建一个简单的表:
CREATE TABLE `x1` (
`a` int(11) NOT NULL AUTO_INCREMENT,
`b` int(11) DEFAULT NULL,
`c` int(11) DEFAULT NULL,
PRIMARY KEY (`a`),
KEY `b` (`b`)
) ENGINE=InnoDB;
插入大量随机数据:
insert into x1 (b,c) select rand()*100, rand()*10000;
insert into x1 (b,c) select rand()*100, rand()*10000 from x1;
insert into x1 (b,c) select rand()*100, rand()*10000 from x1;
……
执行SQL:
root@sb1 04:42:15>set session optimizer_switch=’mrr_cost_based=off';
Query OK, 0 rows affected (0.00 sec)root@sb1 04:42:29>explain select * from x1 where b between 60 and 70 limit 10;
+—-+————-+——-+——-+—————+——+———+——+——–+———————————-+
| id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows   | Extra                            |
+—-+————-+——-+——-+—————+——+———+——+——–+———————————-+
|  1 | SIMPLE      | x1    | range | b             | b    | 5       | NULL | 162690 | Using index condition; Using MRR |
+—-+————-+——-+——-+—————+——+———+——+——–+———————————-+
1 row in set (0.00 sec)
参考代码:MySQL5.6.16
1.优化器阶段:
JOIN::optimize
—> make_join_statistics
     —>get_quick_record_count
          —>SQL_SELECT::test_quick_select
               —>get_key_scans_params
                    —>check_quick_select
                         —>DsMrr_impl::dsmrr_info_const
                              —>handler::multi_range_read_info_const   //计算MRR的COST
2.初始化:
JOIN::exec —>do_select —> sub_select
—>join_init_read_record
     —>QUICK_RANGE_SELECT::reset
          —>ha_innobase::multi_range_read_init
               —>DsMrr_impl::dsmrr_init
                    —>DsMrr_impl::dsmrr_fill_buffer
                         multi_range_read_next
                              handler::read_range_first
                              handler::read_range_next
该步骤会读取请求range的二级索引key范围,并进行快速排序,主函数DsMrr_impl::dsmrr_fill_buffer

 

3.读取聚集索引记录
JOIN::exec —>do_select—>sub_select—>rr_quick—>
QUICK_RANGE_SELECT::get_next
     —>ha_innobase::multi_range_read_next
根据之前排好顺序的Primary Key值,依次读取聚集索引记录

 

相关文章
|
29天前
|
JavaScript 前端开发 编译器
生成 index.d.ts 文件的几种方式
生成 index.d.ts 文件的几种方式
41 0
fetch上传文件报错的问题(multipart: NextPart: EOF)
技术栈 后台: gin(golang) 前端: react+antd+dva 问题 前端这边使用fetch发送http请求的时候,后端解析formData报错: multipart: NextPart: EOF 分析问题 原因是上传文件太小了Content-Length数量太小了,尝试将headers里这字段的value变大,发现实际的请求依然是较小值。
5511 0
|
6月前
|
Docker 容器
求助: 运行模型时报错module 'megatron_util.mpu' has no attribute 'get_model_parallel_rank'
运行ZhipuAI/Multilingual-GLM-Summarization-zh的官方代码范例时,报错AttributeError: MGLMTextSummarizationPipeline: module 'megatron_util.mpu' has no attribute 'get_model_parallel_rank' 环境是基于ModelScope官方docker镜像,尝试了各个版本结果都是一样的。
291 5
|
8月前
|
JavaScript
如何使用 multiparty 工具库在 Node.js 应用里解析 multipart form-data 格式的请求
如何使用 multiparty 工具库在 Node.js 应用里解析 multipart form-data 格式的请求
75 1
|
Android开发
storage/emulated/0路径下的File.listFiles返回值为null
storage/emulated/0路径下的File.listFiles返回值为null
487 0
storage/emulated/0路径下的File.listFiles返回值为null
|
JavaScript 前端开发
使用 ABAP 手动解析包含二进制文件的 multipart/form-data 数据时遇到的问题
使用 ABAP 手动解析包含二进制文件的 multipart/form-data 数据时遇到的问题
201 0
使用 ABAP 手动解析包含二进制文件的 multipart/form-data 数据时遇到的问题
jMeter CSV Data set config 的 sharing mode 和 Thread group loop 配合使用
jMeter CSV Data set config 的 sharing mode 和 Thread group loop 配合使用
135 0
jMeter CSV Data set config 的 sharing mode 和 Thread group loop 配合使用
SAP Odata batch操作,只支持multipart_mixed类型的content-type
SAP Odata batch操作,只支持multipart_mixed类型的content-type
113 0
SAP Odata batch操作,只支持multipart_mixed类型的content-type
|
存储
SE37 test sequence - 在同一个main session内依次执行function module
SE37 test sequence - 在同一个main session内依次执行function module
110 0