Skip to content
This repository was archived by the owner on Mar 1, 2026. It is now read-only.
This repository was archived by the owner on Mar 1, 2026. It is now read-only.

MRR will read the row twice for certain data types #1148

Description

@spetrunia
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;
create table t1 (
  pk int primary key,
  kp1 varchar(100),
  col1 int,
  key(kp1(32))
);
insert into t1 select a,a,a from one_k;
set optimizer_switch='mrr_cost_based=off';

A query that will use MRR:

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 |
+----+-------------+-------+-------+---------------+------+---------+------+------+------------------------+

Put a breakpoint in ha_rocksdb::get_row_by_rowid;
Run the query

select * from t1 where kp1 between '10' and '15';
(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

Note the frames:

  #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)

But:

  #1  0x0000555556dcb74b in myrocks::ha_rocksdb::get_row_by_rowid 
  #2  0x0000555556da8d25 in myrocks::ha_rocksdb::read_row_from_secondary_key 

Why are we reading the row ourselves now?

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions