create table ten(a int primary key);
insert into ten values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
create table one_k(a int primary key);
insert into one_k select A.a + B.a* 10 + C.a * 100 from ten A, ten B, ten C;
explain
select * from t1 where kp1 between '10' and '15';
+----+-------------+-------+-------+---------------+------+---------+------+------+------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+------+---------+------+------+------------------------+
| 1 | SIMPLE | t1 | range | kp1 | kp1 | 35 | NULL | 166 | Using where; Using MRR |
+----+-------------+-------+-------+---------------+------+---------+------+------+------------------------+
(gdb) wher
#0 myrocks::ha_rocksdb::get_row_by_rowid (this=0x7fffb00b4350, buf=0x7fffb00a2c70 "\216\036", rowid=0x7fffb00a09d0 "", rowid_size=8, skip_lookup=false, skip_ttl_check=true) at /home/psergey/dev-git2/mysql-5.6-rocksdb-clean/storage/rocksdb/ha_rocksdb.cc:8965
#1 0x0000555556dcb74b in myrocks::ha_rocksdb::get_row_by_rowid (this=0x7fffb00b4350, buf=0x7fffb00a2c70 "\216\036", rowid=0x7fffb00a09d0 "", rowid_size=8, skip_lookup=false, skip_ttl_check=true) at /home/psergey/dev-git2/mysql-5.6-rocksdb-clean/storage/rocksdb/./ha_rocksdb.h:347
#2 0x0000555556da8d25 in myrocks::ha_rocksdb::read_row_from_secondary_key (this=0x7fffb00b4350, buf=0x7fffb00a2c70 "\216\036", kd=..., move_forward=true) at /home/psergey/dev-git2/mysql-5.6-rocksdb-clean/storage/rocksdb/ha_rocksdb.cc:8220
#3 0x0000555556da9e0f in myrocks::ha_rocksdb::index_read_map_impl (this=0x7fffb00b4350, buf=0x7fffb00a2c70 "\216\036", key=0x7fffb00afe28 "", keypart_map=1, find_flag=HA_READ_KEY_OR_NEXT, end_key=0x7fffb00b45d0) at /home/psergey/dev-git2/mysql-5.6-rocksdb-clean/storage/rocksdb/ha_rocksdb.cc:8593
#4 0x0000555556da9371 in myrocks::ha_rocksdb::read_range_first (this=0x7fffb00b4350, start_key=0x7fffb00b45b0, end_key=0x7fffb00b45d0, eq_range_arg=false, sorted=false) at /home/psergey/dev-git2/mysql-5.6-rocksdb-clean/storage/rocksdb/ha_rocksdb.cc:8375
#5 0x0000555556474070 in handler::multi_range_read_next (this=0x7fffb00b4350, range_info=0x7ffff4558a80) at /home/psergey/dev-git2/mysql-5.6-rocksdb-clean/sql/handler.cc:6447
#6 0x0000555556dd8c3a in myrocks::Mrr_sec_key_rowid_source::get_next_rowid (this=0x7fffb000e320, buf=0x7fffb0039078 "", size=0x7ffff4558a60, range_ptr=0x7ffff4558a80) at /home/psergey/dev-git2/mysql-5.6-rocksdb-clean/storage/rocksdb/ha_rocksdb.cc:15584
#7 0x0000555556dc3b9a in myrocks::ha_rocksdb::mrr_fill_buffer (this=0x7fffb00b4350) at /home/psergey/dev-git2/mysql-5.6-rocksdb-clean/storage/rocksdb/ha_rocksdb.cc:15770
#8 0x0000555556dc3897 in myrocks::ha_rocksdb::multi_range_read_init (this=0x7fffb00b4350, seq=0x7ffff4558bc0, seq_init_param=0x7fffb009c8a0, n_ranges=1, mode=1028, buf=0x7fffb0035b40) at /home/psergey/dev-git2/mysql-5.6-rocksdb-clean/storage/rocksdb/ha_rocksdb.cc:15656
#9 0x00005555568982d6 in QUICK_RANGE_SELECT::reset (this=0x7fffb009c8a0) at /home/psergey/dev-git2/mysql-5.6-rocksdb-clean/sql/opt_range.cc:10706
#10 0x000055555665ef5f in join_init_read_record (tab=0x7fffb0011c38) at /home/psergey/dev-git2/mysql-5.6-rocksdb-clean/sql/sql_executor.cc:2432
#11 0x000055555665c609 in sub_select (join=0x7fffb0006760, join_tab=0x7fffb0011c38, end_of_records=false) at /home/psergey/dev-git2/mysql-5.6-rocksdb-clean/sql/sql_executor.cc:1297
#12 0x000055555665be47 in do_select (join=0x7fffb0006760) at /home/psergey/dev-git2/mysql-5.6-rocksdb-clean/sql/sql_executor.cc:953
#13 0x0000555556659c41 in JOIN::exec (this=0x7fffb0006760) at /home/psergey/dev-git2/mysql-5.6-rocksdb-clean/sql/sql_executor.cc:207
#14 0x00005555566d61a3 in mysql_execute_select (thd=0x55555824fdb0, select_lex=0x555558253dd0, free_join=true) at /home/psergey/dev-git2/mysql-5.6-rocksdb-clean/sql/sql_select.cc:1133
#15 0x00005555566d64d9 in mysql_select (thd=0x55555824fdb0, tables=0x7fffb0005af8, wild_num=1, fields=..., conds=0x7fffb0006370, order=0x555558253f98, group=0x555558253ed0, having=0x0, select_options=2147748608, result=0x7fffb0006738, unit=0x555558253778, select_lex=0x555558253dd0) at /home/psergey/dev-git2/mysql-5.6-rocksdb-clean/sql/sql_select.cc:1254
#16 0x00005555566d411b in handle_select (thd=0x55555824fdb0, result=0x7fffb0006738, setup_tables_done_option=0) at /home/psergey/dev-git2/mysql-5.6-rocksdb-clean/sql/sql_select.cc:116
#17 0x00005555566a1042 in execute_sqlcom_select (thd=0x55555824fdb0, all_tables=0x7fffb0005af8, last_timer=0x7ffff455a438) at /home/psergey/dev-git2/mysql-5.6-rocksdb-clean/sql/sql_parse.cc:6944
#18 0x0000555556698435 in mysql_execute_command (thd=0x55555824fdb0, statement_start_time=0x7ffff455a2c8, post_parse=0x7ffff455a438) at /home/psergey/dev-git2/mysql-5.6-rocksdb-clean/sql/sql_parse.cc:4024
#19 0x00005555566a43c1 in mysql_parse (thd=0x55555824fdb0, rawbuf=0x7fffb0005880 "select * from t1 where kp1 between '10' and '15'", length=48, parser_state=0x7ffff455ae10, last_timer=0x7ffff455a438, async_commit=0x7ffff455a3fd "") at /home/psergey/dev-git2/mysql-5.6-rocksdb-clean/sql/sql_parse.cc:8353
#6 0x0000555556dd8c3a in myrocks::Mrr_sec_key_rowid_source::get_next_rowid
#7 0x0000555556dc3b9a in myrocks::ha_rocksdb::mrr_fill_buffer
#8 0x0000555556dc3897 in myrocks::ha_rocksdb::multi_range_read_init
OK we are in MRR scan, in the phase that should just collect the ROWIDs. (The row itself will be fetched with a MultiGet call)
#1 0x0000555556dcb74b in myrocks::ha_rocksdb::get_row_by_rowid
#2 0x0000555556da8d25 in myrocks::ha_rocksdb::read_row_from_secondary_key
A query that will use MRR:
Put a breakpoint in ha_rocksdb::get_row_by_rowid;
Run the query
Note the frames:
OK we are in MRR scan, in the phase that should just collect the ROWIDs. (The row itself will be fetched with a MultiGet call)
But:
Why are we reading the row ourselves now?