diff options
Diffstat (limited to '')
-rw-r--r-- | storage/rocksdb/mysql-test/rocksdb/r/rocksdb_icp.result | 257 |
1 files changed, 257 insertions, 0 deletions
diff --git a/storage/rocksdb/mysql-test/rocksdb/r/rocksdb_icp.result b/storage/rocksdb/mysql-test/rocksdb/r/rocksdb_icp.result new file mode 100644 index 00000000..101e159e --- /dev/null +++ b/storage/rocksdb/mysql-test/rocksdb/r/rocksdb_icp.result @@ -0,0 +1,257 @@ +select * from information_schema.engines where engine = 'rocksdb'; +ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS +ROCKSDB DEFAULT RocksDB storage engine YES YES YES +drop table if exists t0,t1,t2,t3; +create table t0 (a int) engine=myisam; +insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); +create table t1(a int) engine=myisam; +insert into t1 select A.a + B.a* 10 + C.a * 100 from t0 A, t0 B, t0 C; +create table t2 ( +pk int primary key, +kp1 int, +kp2 int, +col1 int, +key (kp1,kp2) comment 'cf1' +) engine=rocksdb; +insert into t2 select a,a,a,a from t1; +# Try a basic case: +explain +select * from t2 where kp1 between 1 and 10 and mod(kp2,2)=0; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t2 range kp1 kp1 5 NULL # Using index condition +select * from t2 where kp1 between 1 and 10 and mod(kp2,2)=0; +pk kp1 kp2 col1 +2 2 2 2 +4 4 4 4 +6 6 6 6 +8 8 8 8 +10 10 10 10 +# Check that ICP doesnt work for columns where column value +# cant be restored from mem-comparable form: +create table t3 ( +pk int primary key, +kp1 int, +kp2 varchar(10) collate utf8_general_ci, +col1 int, +key (kp1,kp2) comment 'cf1' +) engine=rocksdb; +insert into t3 select a,a/10,a,a from t1; +# This must not use ICP: +explain +select * from t3 where kp1=3 and kp2 like '%foo%'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t3 ref kp1 kp1 5 const # Using where +explain format=json +select * from t3 where kp1 between 2 and 4 and mod(kp1,3)=0 and kp2 like '%foo%'; +EXPLAIN +{ + "query_block": { + "select_id": 1, + "table": { + "table_name": "t3", + "access_type": "range", + "possible_keys": ["kp1"], + "key": "kp1", + "key_length": "5", + "used_key_parts": ["kp1"], + "rows": 1000, + "filtered": 100, + "index_condition": "t3.kp1 between 2 and 4 and t3.kp1 MOD 3 = 0", + "attached_condition": "t3.kp2 like '%foo%'" + } + } +} +# Check that we handle the case where out-of-range is encountered sooner +# than matched index condition +explain +select * from t2 where kp1< 3 and kp2+1>50000; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t2 range kp1 kp1 5 NULL # Using index condition +select * from t2 where kp1< 3 and kp2+1>50000; +pk kp1 kp2 col1 +explain +select * from t2 where kp1< 3 and kp2+1>50000; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t2 range kp1 kp1 5 NULL # Using index condition +select * from t2 where kp1< 3 and kp2+1>50000; +pk kp1 kp2 col1 +# Try doing backwards scans +# MariaDB: ICP is not supported for reverse scans. +explain +select * from t2 where kp1 between 1 and 10 and mod(kp2,2)=0 order by kp1 desc; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t2 range kp1 kp1 5 NULL # Using where +select * from t2 where kp1 between 1 and 10 and mod(kp2,2)=0 order by kp1 desc; +pk kp1 kp2 col1 +10 10 10 10 +8 8 8 8 +6 6 6 6 +4 4 4 4 +2 2 2 2 +explain +select * from t2 where kp1 >990 and mod(kp2,2)=0 order by kp1 desc; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t2 range kp1 kp1 5 NULL # Using where +select * from t2 where kp1 >990 and mod(kp2,2)=0 order by kp1 desc; +pk kp1 kp2 col1 +998 998 998 998 +996 996 996 996 +994 994 994 994 +992 992 992 992 +explain +select * from t2 where kp1< 3 and kp2+1>50000 order by kp1 desc; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t2 range kp1 kp1 5 NULL # Using where +select * from t2 where kp1< 3 and kp2+1>50000 order by kp1 desc; +pk kp1 kp2 col1 +drop table t0,t1,t2,t3; +# +# Check how ICP affects counters +# +# First, some preparations +# +# in facebook/mysql-5.6, it was: +# select ROWS_READ, ROWS_REQUESTED, ROWS_INDEX_FIRST, ROWS_INDEX_NEXT +# +# In MariaDB, we do: +create procedure save_read_stats() +begin +set @rr=(select ROWS_READ +from information_schema.table_statistics +where table_name='t4' and table_schema=database()); +set @rif= (select VARIABLE_VALUE +from information_schema.session_status +where VARIABLE_NAME='Handler_read_first'); +set @rin=(select VARIABLE_VALUE +from information_schema.session_status +where VARIABLE_NAME='Handler_read_next'); +set @icp_attempts=(select VARIABLE_VALUE +from information_schema.session_status +where VARIABLE_NAME='Handler_icp_attempts'); +set @icp_matches=(select VARIABLE_VALUE +from information_schema.session_status +where VARIABLE_NAME='Handler_icp_match'); +end| +create procedure get_read_stats() +begin +select +(select ROWS_READ +from information_schema.table_statistics +where table_name='t4' and table_schema=database() +) - @rr as ROWS_READ_DIFF, +(select VARIABLE_VALUE - @rif +from information_schema.session_status +where VARIABLE_NAME='Handler_read_first') as ROWS_INDEX_FIRST, +(select VARIABLE_VALUE - @rin +from information_schema.session_status +where VARIABLE_NAME='Handler_read_next') as ROWS_INDEX_NEXT, +(select VARIABLE_VALUE - @icp_attempts +from information_schema.session_status +where VARIABLE_NAME='Handler_icp_attempts') as ICP_ATTEMPTS, +(select VARIABLE_VALUE - @icp_matches +from information_schema.session_status +where VARIABLE_NAME='Handler_icp_match') as ICP_MATCHES; +end| +create table t4 ( +id int, +id1 int, +id2 int, +value int, +value2 varchar(100), +primary key (id), +key id1_id2 (id1, id2) comment 'cf1' +) engine=rocksdb charset=latin1 collate latin1_bin; +insert into t4 values +(1,1,1,1,1), (2,1,2,2,2), (3,1,3,3,3),(4,1,4,4,4),(5,1,5,5,5), +(6,1,6,6,6), (7,1,7,7,7), (8,1,8,8,8),(9,1,9,9,9),(10,1,10,10,10); +# +# Now, the test itself +# +call save_read_stats(); +call get_read_stats(); +ROWS_READ_DIFF ROWS_INDEX_FIRST ROWS_INDEX_NEXT ICP_ATTEMPTS ICP_MATCHES +0 0 0 0 0 +# ============== index-only query ============== +explain +select id1,id2 from t4 force index (id1_id2) where id1=1 and id2 % 10 = 1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t4 ref id1_id2 id1_id2 5 const # Using where; Using index +call save_read_stats(); +select id1,id2 from t4 force index (id1_id2) where id1=1 and id2 % 10 = 1; +id1 id2 +1 1 +call get_read_stats(); +ROWS_READ_DIFF 10 +ROWS_INDEX_FIRST 0 +ROWS_INDEX_NEXT 10 +ICP_ATTEMPTS 0 +ICP_MATCHES 0 +# ============== Query without ICP ============== +set optimizer_switch='index_condition_pushdown=off'; +explain +select * from t4 force index (id1_id2) where id1=1 and id2 % 10 = 1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t4 ref id1_id2 id1_id2 5 const # Using where +call save_read_stats(); +select * from t4 force index (id1_id2) where id1=1 and id2 % 10 = 1; +id id1 id2 value value2 +1 1 1 1 1 +call get_read_stats(); +ROWS_READ_DIFF 10 +ROWS_INDEX_FIRST 0 +ROWS_INDEX_NEXT 10 +ICP_ATTEMPTS 0 +ICP_MATCHES 0 +# ============== Query with ICP ============== +set optimizer_switch='index_condition_pushdown=on'; +explain +select * from t4 force index (id1_id2) where id1=1 and id2 % 10 = 1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t4 ref id1_id2 id1_id2 5 const # Using index condition +call save_read_stats(); +select * from t4 force index (id1_id2) where id1=1 and id2 % 10 = 1; +id id1 id2 value value2 +1 1 1 1 1 +call get_read_stats(); +ROWS_READ_DIFF 1 +ROWS_INDEX_FIRST 0 +ROWS_INDEX_NEXT 1 +ICP_ATTEMPTS 10 +ICP_MATCHES 1 +drop table t4; +drop procedure save_read_stats; +drop procedure get_read_stats; +# +# Issue #67: Inefficient index condition pushdown +# +create table t0 (a int) engine=myisam; +insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); +create table t1 ( +pk int not null primary key, +key1 bigint(20) unsigned, +col1 int, +key (key1) +) engine=rocksdb; +insert into t1 +select +A.a+10*B.a+100*C.a, +A.a+10*B.a+100*C.a, +1234 +from t0 A, t0 B, t0 C; +set @count=0; +explain +select * from t1 force index(key1) where key1=1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref key1 key1 9 const # +set @count_diff =(select (value - @count) from information_schema.rocksdb_perf_context +where table_schema=database() and table_name='t1' and stat_type='INTERNAL_KEY_SKIPPED_COUNT'); +select * from t1 force index(key1) where key1=1; +pk key1 col1 +1 1 1234 +set @count_diff =(select (value - @count) from information_schema.rocksdb_perf_context +where table_schema=database() and table_name='t1' and stat_type='INTERNAL_KEY_SKIPPED_COUNT'); +# The following must be =1, or in any case not 999: +select @count_diff as "INTERNAL_KEY_SKIPPED_COUNT increment"; +INTERNAL_KEY_SKIPPED_COUNT increment +1 +drop table t0,t1; |