mirror of
https://github.com/MariaDB/server.git
synced 2025-01-30 10:31:54 +01:00
Implementation of the MWL#247: Make the optimizer use extended keys.
The main patch. .
This commit is contained in:
parent
1c47e1ca0d
commit
b6b5f9fabe
13 changed files with 10204 additions and 72 deletions
8997
mysql-test/include/dbt3_s001.inc
Normal file
8997
mysql-test/include/dbt3_s001.inc
Normal file
File diff suppressed because it is too large
Load diff
566
mysql-test/r/innodb_ext_key.result
Normal file
566
mysql-test/r/innodb_ext_key.result
Normal file
|
@ -0,0 +1,566 @@
|
||||||
|
DROP TABLE IF EXISTS t1,t2,t3,t4;
|
||||||
|
DROP DATABASE IF EXISTS dbt3_s001;
|
||||||
|
SET SESSION STORAGE_ENGINE='InnoDB';
|
||||||
|
CREATE DATABASE dbt3_s001;
|
||||||
|
use dbt3_s001;
|
||||||
|
set @save_ext_key_optimizer_switch=@@optimizer_switch;
|
||||||
|
set optimizer_switch='extended_keys=off';
|
||||||
|
explain
|
||||||
|
select count(*) from lineitem where l_orderkey=130 and l_shipdate='1992-07-01';
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE lineitem ref PRIMARY,i_l_shipdate,i_l_orderkey,i_l_orderkey_quantity PRIMARY 4 const 5 Using where
|
||||||
|
flush status;
|
||||||
|
select count(*) from lineitem where l_orderkey=130 and l_shipdate='1992-07-01';
|
||||||
|
count(*)
|
||||||
|
1
|
||||||
|
show status like 'handler_read%';
|
||||||
|
Variable_name Value
|
||||||
|
Handler_read_first 0
|
||||||
|
Handler_read_key 1
|
||||||
|
Handler_read_next 5
|
||||||
|
Handler_read_prev 0
|
||||||
|
Handler_read_rnd 0
|
||||||
|
Handler_read_rnd_next 0
|
||||||
|
set optimizer_switch='extended_keys=on';
|
||||||
|
explain
|
||||||
|
select count(*) from lineitem where l_orderkey=130 and l_shipdate='1992-07-01';
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE lineitem ref PRIMARY,i_l_shipdate,i_l_orderkey,i_l_orderkey_quantity i_l_shipdate 8 const,const 1 Using index
|
||||||
|
flush status;
|
||||||
|
select count(*) from lineitem where l_orderkey=130 and l_shipdate='1992-07-01';
|
||||||
|
count(*)
|
||||||
|
1
|
||||||
|
show status like 'handler_read%';
|
||||||
|
Variable_name Value
|
||||||
|
Handler_read_first 0
|
||||||
|
Handler_read_key 1
|
||||||
|
Handler_read_next 1
|
||||||
|
Handler_read_prev 0
|
||||||
|
Handler_read_rnd 0
|
||||||
|
Handler_read_rnd_next 0
|
||||||
|
set optimizer_switch='extended_keys=off';
|
||||||
|
explain
|
||||||
|
select count(*) from lineitem
|
||||||
|
where l_orderkey=130 and l_linenumber=2 and l_shipdate='1992-07-01';
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE lineitem const PRIMARY,i_l_shipdate,i_l_orderkey,i_l_orderkey_quantity PRIMARY 8 const,const 1
|
||||||
|
flush status;
|
||||||
|
select count(*) from lineitem
|
||||||
|
where l_orderkey=130 and l_linenumber=2 and l_shipdate='1992-07-01';
|
||||||
|
count(*)
|
||||||
|
1
|
||||||
|
show status like 'handler_read%';
|
||||||
|
Variable_name Value
|
||||||
|
Handler_read_first 0
|
||||||
|
Handler_read_key 1
|
||||||
|
Handler_read_next 0
|
||||||
|
Handler_read_prev 0
|
||||||
|
Handler_read_rnd 0
|
||||||
|
Handler_read_rnd_next 0
|
||||||
|
set optimizer_switch='extended_keys=on';
|
||||||
|
explain
|
||||||
|
select count(*) from lineitem
|
||||||
|
where l_orderkey=130 and l_linenumber=2 and l_shipdate='1992-07-01';
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE lineitem const PRIMARY,i_l_shipdate,i_l_orderkey,i_l_orderkey_quantity i_l_shipdate 12 const,const,const 1 Using index
|
||||||
|
flush status;
|
||||||
|
select count(*) from lineitem
|
||||||
|
where l_orderkey=130 and l_linenumber=2 and l_shipdate='1992-07-01';
|
||||||
|
count(*)
|
||||||
|
1
|
||||||
|
show status like 'handler_read%';
|
||||||
|
Variable_name Value
|
||||||
|
Handler_read_first 0
|
||||||
|
Handler_read_key 1
|
||||||
|
Handler_read_next 0
|
||||||
|
Handler_read_prev 0
|
||||||
|
Handler_read_rnd 0
|
||||||
|
Handler_read_rnd_next 0
|
||||||
|
set optimizer_switch='extended_keys=off';
|
||||||
|
explain
|
||||||
|
select count(*) from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE lineitem ref PRIMARY,i_l_shipdate,i_l_orderkey,i_l_orderkey_quantity i_l_shipdate 4 const 6 Using where; Using index
|
||||||
|
flush status;
|
||||||
|
select count(*) from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000;
|
||||||
|
count(*)
|
||||||
|
1
|
||||||
|
show status like 'handler_read%';
|
||||||
|
Variable_name Value
|
||||||
|
Handler_read_first 0
|
||||||
|
Handler_read_key 1
|
||||||
|
Handler_read_next 6
|
||||||
|
Handler_read_prev 0
|
||||||
|
Handler_read_rnd 0
|
||||||
|
Handler_read_rnd_next 0
|
||||||
|
set optimizer_switch='extended_keys=on';
|
||||||
|
explain
|
||||||
|
select count(*) from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE lineitem range PRIMARY,i_l_shipdate,i_l_orderkey,i_l_orderkey_quantity i_l_shipdate 8 NULL 1 Using where; Using index
|
||||||
|
flush status;
|
||||||
|
select count(*) from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000;
|
||||||
|
count(*)
|
||||||
|
1
|
||||||
|
show status like 'handler_read%';
|
||||||
|
Variable_name Value
|
||||||
|
Handler_read_first 0
|
||||||
|
Handler_read_key 1
|
||||||
|
Handler_read_next 1
|
||||||
|
Handler_read_prev 0
|
||||||
|
Handler_read_rnd 0
|
||||||
|
Handler_read_rnd_next 0
|
||||||
|
set optimizer_switch='extended_keys=off';
|
||||||
|
explain
|
||||||
|
select l_orderkey, l_linenumber from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1001 and 2000;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE lineitem ref PRIMARY,i_l_shipdate,i_l_orderkey,i_l_orderkey_quantity i_l_shipdate 4 const 6 Using where; Using index
|
||||||
|
flush status;
|
||||||
|
select l_orderkey, l_linenumber from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1001 and 2000;
|
||||||
|
l_orderkey l_linenumber
|
||||||
|
1088 3
|
||||||
|
1217 1
|
||||||
|
1221 3
|
||||||
|
show status like 'handler_read%';
|
||||||
|
Variable_name Value
|
||||||
|
Handler_read_first 0
|
||||||
|
Handler_read_key 1
|
||||||
|
Handler_read_next 6
|
||||||
|
Handler_read_prev 0
|
||||||
|
Handler_read_rnd 0
|
||||||
|
Handler_read_rnd_next 0
|
||||||
|
set optimizer_switch='extended_keys=on';
|
||||||
|
explain
|
||||||
|
select l_orderkey, l_linenumber from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1001 and 2000;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE lineitem range PRIMARY,i_l_shipdate,i_l_orderkey,i_l_orderkey_quantity i_l_shipdate 8 NULL 3 Using where; Using index
|
||||||
|
flush status;
|
||||||
|
select l_orderkey, l_linenumber from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1001 and 2000;
|
||||||
|
l_orderkey l_linenumber
|
||||||
|
1088 3
|
||||||
|
1217 1
|
||||||
|
1221 3
|
||||||
|
show status like 'handler_read%';
|
||||||
|
Variable_name Value
|
||||||
|
Handler_read_first 0
|
||||||
|
Handler_read_key 1
|
||||||
|
Handler_read_next 3
|
||||||
|
Handler_read_prev 0
|
||||||
|
Handler_read_rnd 0
|
||||||
|
Handler_read_rnd_next 0
|
||||||
|
set optimizer_switch='extended_keys=off';
|
||||||
|
explain
|
||||||
|
select min(l_orderkey) from lineitem where l_shipdate='1992-07-01';
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE lineitem ref i_l_shipdate i_l_shipdate 4 const 6 Using index
|
||||||
|
flush status;
|
||||||
|
select min(l_orderkey) from lineitem where l_shipdate='1992-07-01';
|
||||||
|
min(l_orderkey)
|
||||||
|
130
|
||||||
|
show status like 'handler_read%';
|
||||||
|
Variable_name Value
|
||||||
|
Handler_read_first 0
|
||||||
|
Handler_read_key 1
|
||||||
|
Handler_read_next 6
|
||||||
|
Handler_read_prev 0
|
||||||
|
Handler_read_rnd 0
|
||||||
|
Handler_read_rnd_next 0
|
||||||
|
set optimizer_switch='extended_keys=on';
|
||||||
|
explain
|
||||||
|
select min(l_orderkey) from lineitem where l_shipdate='1992-07-01';
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
||||||
|
flush status;
|
||||||
|
select min(l_orderkey) from lineitem where l_shipdate='1992-07-01';
|
||||||
|
min(l_orderkey)
|
||||||
|
130
|
||||||
|
show status like 'handler_read%';
|
||||||
|
Variable_name Value
|
||||||
|
Handler_read_first 0
|
||||||
|
Handler_read_key 1
|
||||||
|
Handler_read_next 0
|
||||||
|
Handler_read_prev 0
|
||||||
|
Handler_read_rnd 0
|
||||||
|
Handler_read_rnd_next 0
|
||||||
|
set optimizer_switch='extended_keys=off';
|
||||||
|
explain
|
||||||
|
select min(l_orderkey) from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1001 and 2000;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE lineitem ref PRIMARY,i_l_shipdate,i_l_orderkey,i_l_orderkey_quantity i_l_shipdate 4 const 6 Using where; Using index
|
||||||
|
flush status;
|
||||||
|
select min(l_orderkey) from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1001 and 2000;
|
||||||
|
min(l_orderkey)
|
||||||
|
1088
|
||||||
|
show status like 'handler_read%';
|
||||||
|
Variable_name Value
|
||||||
|
Handler_read_first 0
|
||||||
|
Handler_read_key 1
|
||||||
|
Handler_read_next 6
|
||||||
|
Handler_read_prev 0
|
||||||
|
Handler_read_rnd 0
|
||||||
|
Handler_read_rnd_next 0
|
||||||
|
set optimizer_switch='extended_keys=on';
|
||||||
|
explain
|
||||||
|
select min(l_orderkey) from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1001 and 2000;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
||||||
|
flush status;
|
||||||
|
select min(l_orderkey) from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1001 and 2000;
|
||||||
|
min(l_orderkey)
|
||||||
|
1088
|
||||||
|
show status like 'handler_read%';
|
||||||
|
Variable_name Value
|
||||||
|
Handler_read_first 0
|
||||||
|
Handler_read_key 1
|
||||||
|
Handler_read_next 0
|
||||||
|
Handler_read_prev 0
|
||||||
|
Handler_read_rnd 0
|
||||||
|
Handler_read_rnd_next 0
|
||||||
|
set optimizer_switch='extended_keys=off';
|
||||||
|
explain
|
||||||
|
select max(l_linenumber) from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey=130;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE lineitem ref PRIMARY,i_l_shipdate,i_l_orderkey,i_l_orderkey_quantity PRIMARY 4 const 5 Using where
|
||||||
|
flush status;
|
||||||
|
select max(l_linenumber) from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey=130;
|
||||||
|
max(l_linenumber)
|
||||||
|
2
|
||||||
|
show status like 'handler_read%';
|
||||||
|
Variable_name Value
|
||||||
|
Handler_read_first 0
|
||||||
|
Handler_read_key 1
|
||||||
|
Handler_read_next 5
|
||||||
|
Handler_read_prev 0
|
||||||
|
Handler_read_rnd 0
|
||||||
|
Handler_read_rnd_next 0
|
||||||
|
set optimizer_switch='extended_keys=on';
|
||||||
|
explain
|
||||||
|
select max(l_linenumber) from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey=130;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
||||||
|
flush status;
|
||||||
|
select max(l_linenumber) from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey=130;
|
||||||
|
max(l_linenumber)
|
||||||
|
2
|
||||||
|
show status like 'handler_read%';
|
||||||
|
Variable_name Value
|
||||||
|
Handler_read_first 0
|
||||||
|
Handler_read_key 1
|
||||||
|
Handler_read_next 0
|
||||||
|
Handler_read_prev 0
|
||||||
|
Handler_read_rnd 0
|
||||||
|
Handler_read_rnd_next 0
|
||||||
|
set optimizer_switch='extended_keys=off';
|
||||||
|
explain
|
||||||
|
select l_orderkey, l_linenumber
|
||||||
|
from lineitem use index (i_l_shipdate, i_l_receiptdate)
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey=130
|
||||||
|
or l_receiptdate='1992-07-01' and l_orderkey=5603;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE lineitem index_merge i_l_shipdate,i_l_receiptdate i_l_shipdate,i_l_receiptdate 4,4 NULL 9 Using union(i_l_shipdate,i_l_receiptdate); Using where
|
||||||
|
flush status;
|
||||||
|
select l_orderkey, l_linenumber
|
||||||
|
from lineitem use index (i_l_shipdate, i_l_receiptdate)
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey=130
|
||||||
|
or l_receiptdate='1992-07-01' and l_orderkey=5603;
|
||||||
|
l_orderkey l_linenumber
|
||||||
|
130 2
|
||||||
|
5603 2
|
||||||
|
show status like 'handler_read%';
|
||||||
|
Variable_name Value
|
||||||
|
Handler_read_first 0
|
||||||
|
Handler_read_key 2
|
||||||
|
Handler_read_next 9
|
||||||
|
Handler_read_prev 0
|
||||||
|
Handler_read_rnd 9
|
||||||
|
Handler_read_rnd_next 0
|
||||||
|
set optimizer_switch='extended_keys=on';
|
||||||
|
explain
|
||||||
|
select l_orderkey, l_linenumber
|
||||||
|
from lineitem use index (i_l_shipdate, i_l_receiptdate)
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey=130
|
||||||
|
or l_receiptdate='1992-07-01' and l_orderkey=5603;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE lineitem index_merge i_l_shipdate,i_l_receiptdate i_l_shipdate,i_l_receiptdate 8,8 NULL 2 Using sort_union(i_l_shipdate,i_l_receiptdate); Using where
|
||||||
|
flush status;
|
||||||
|
select l_orderkey, l_linenumber
|
||||||
|
from lineitem use index (i_l_shipdate, i_l_receiptdate)
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey=130
|
||||||
|
or l_receiptdate='1992-07-01' and l_orderkey=5603;
|
||||||
|
l_orderkey l_linenumber
|
||||||
|
130 2
|
||||||
|
5603 2
|
||||||
|
show status like 'handler_read%';
|
||||||
|
Variable_name Value
|
||||||
|
Handler_read_first 0
|
||||||
|
Handler_read_key 2
|
||||||
|
Handler_read_next 2
|
||||||
|
Handler_read_prev 0
|
||||||
|
Handler_read_rnd 2
|
||||||
|
Handler_read_rnd_next 0
|
||||||
|
set optimizer_switch='extended_keys=off';
|
||||||
|
explain
|
||||||
|
select l_orderkey, l_linenumber
|
||||||
|
from lineitem use index (i_l_shipdate, i_l_receiptdate)
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000
|
||||||
|
or l_receiptdate='1992-07-01' and l_orderkey between 5001 and 6000;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE lineitem index_merge i_l_shipdate,i_l_receiptdate i_l_shipdate,i_l_receiptdate 4,4 NULL 9 Using union(i_l_shipdate,i_l_receiptdate); Using where
|
||||||
|
flush status;
|
||||||
|
select l_orderkey, l_linenumber
|
||||||
|
from lineitem use index (i_l_shipdate, i_l_receiptdate)
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000
|
||||||
|
or l_receiptdate='1992-07-01' and l_orderkey between 5001 and 6000;
|
||||||
|
l_orderkey l_linenumber
|
||||||
|
130 2
|
||||||
|
5603 2
|
||||||
|
5959 3
|
||||||
|
show status like 'handler_read%';
|
||||||
|
Variable_name Value
|
||||||
|
Handler_read_first 0
|
||||||
|
Handler_read_key 2
|
||||||
|
Handler_read_next 9
|
||||||
|
Handler_read_prev 0
|
||||||
|
Handler_read_rnd 9
|
||||||
|
Handler_read_rnd_next 0
|
||||||
|
set optimizer_switch='extended_keys=on';
|
||||||
|
explain
|
||||||
|
select l_orderkey, l_linenumber
|
||||||
|
from lineitem use index (i_l_shipdate, i_l_receiptdate)
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000
|
||||||
|
or l_receiptdate='1992-07-01' and l_orderkey between 5001 and 6000;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE lineitem index_merge i_l_shipdate,i_l_receiptdate i_l_shipdate,i_l_receiptdate 8,8 NULL 3 Using sort_union(i_l_shipdate,i_l_receiptdate); Using where
|
||||||
|
flush status;
|
||||||
|
select l_orderkey, l_linenumber
|
||||||
|
from lineitem use index (i_l_shipdate, i_l_receiptdate)
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000
|
||||||
|
or l_receiptdate='1992-07-01' and l_orderkey between 5001 and 6000;
|
||||||
|
l_orderkey l_linenumber
|
||||||
|
130 2
|
||||||
|
5603 2
|
||||||
|
5959 3
|
||||||
|
show status like 'handler_read%';
|
||||||
|
Variable_name Value
|
||||||
|
Handler_read_first 0
|
||||||
|
Handler_read_key 2
|
||||||
|
Handler_read_next 3
|
||||||
|
Handler_read_prev 0
|
||||||
|
Handler_read_rnd 3
|
||||||
|
Handler_read_rnd_next 0
|
||||||
|
set optimizer_switch='extended_keys=off';
|
||||||
|
explain
|
||||||
|
select l_orderkey, l_linenumber from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000
|
||||||
|
or l_receiptdate='1992-07-01' and l_orderkey between 5001 and 6000;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE lineitem index_merge PRIMARY,i_l_shipdate,i_l_receiptdate,i_l_orderkey,i_l_orderkey_quantity i_l_shipdate,PRIMARY,i_l_receiptdate,PRIMARY 4,4,4,4 NULL 2 Using union(intersect(i_l_shipdate,PRIMARY),intersect(i_l_receiptdate,PRIMARY)); Using where
|
||||||
|
flush status;
|
||||||
|
select l_orderkey, l_linenumber from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000
|
||||||
|
or l_receiptdate='1992-07-01' and l_orderkey between 5001 and 6000;
|
||||||
|
l_orderkey l_linenumber
|
||||||
|
130 2
|
||||||
|
5603 2
|
||||||
|
5959 3
|
||||||
|
show status like 'handler_read%';
|
||||||
|
Variable_name Value
|
||||||
|
Handler_read_first 0
|
||||||
|
Handler_read_key 2
|
||||||
|
Handler_read_next 9
|
||||||
|
Handler_read_prev 0
|
||||||
|
Handler_read_rnd 3
|
||||||
|
Handler_read_rnd_next 0
|
||||||
|
set optimizer_switch='extended_keys=on';
|
||||||
|
explain
|
||||||
|
select l_orderkey, l_linenumber from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000
|
||||||
|
or l_receiptdate='1992-07-01' and l_orderkey between 5001 and 6000;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE lineitem index_merge PRIMARY,i_l_shipdate,i_l_receiptdate,i_l_orderkey,i_l_orderkey_quantity i_l_shipdate,i_l_receiptdate 8,8 NULL 3 Using sort_union(i_l_shipdate,i_l_receiptdate); Using where
|
||||||
|
flush status;
|
||||||
|
select l_orderkey, l_linenumber from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000
|
||||||
|
or l_receiptdate='1992-07-01' and l_orderkey between 5001 and 6000;
|
||||||
|
l_orderkey l_linenumber
|
||||||
|
130 2
|
||||||
|
5603 2
|
||||||
|
5959 3
|
||||||
|
show status like 'handler_read%';
|
||||||
|
Variable_name Value
|
||||||
|
Handler_read_first 0
|
||||||
|
Handler_read_key 2
|
||||||
|
Handler_read_next 3
|
||||||
|
Handler_read_prev 0
|
||||||
|
Handler_read_rnd 3
|
||||||
|
Handler_read_rnd_next 0
|
||||||
|
set optimizer_switch='extended_keys=off';
|
||||||
|
explain
|
||||||
|
select max(l_orderkey) from lineitem
|
||||||
|
where l_partkey between 1 and 10 group by l_partkey;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE lineitem range i_l_suppkey_partkey,i_l_partkey i_l_partkey 5 NULL # Using where; Using index
|
||||||
|
flush status;
|
||||||
|
select max(l_orderkey) from lineitem
|
||||||
|
where l_partkey between 1 and 10 group by l_partkey;
|
||||||
|
max(l_orderkey)
|
||||||
|
5984
|
||||||
|
5957
|
||||||
|
5892
|
||||||
|
5856
|
||||||
|
5959
|
||||||
|
5957
|
||||||
|
5794
|
||||||
|
5894
|
||||||
|
5859
|
||||||
|
5632
|
||||||
|
show status like 'handler_read%';
|
||||||
|
Variable_name Value
|
||||||
|
Handler_read_first 0
|
||||||
|
Handler_read_key 1
|
||||||
|
Handler_read_next 294
|
||||||
|
Handler_read_prev 0
|
||||||
|
Handler_read_rnd 0
|
||||||
|
Handler_read_rnd_next 0
|
||||||
|
set optimizer_switch='extended_keys=on';
|
||||||
|
explain
|
||||||
|
select max(l_orderkey) from lineitem
|
||||||
|
where l_partkey between 1 and 10 group by l_partkey;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE lineitem range i_l_suppkey_partkey,i_l_partkey i_l_partkey 5 NULL # Using where; Using index for group-by
|
||||||
|
flush status;
|
||||||
|
select max(l_orderkey) from lineitem
|
||||||
|
where l_partkey between 1 and 10 group by l_partkey;
|
||||||
|
max(l_orderkey)
|
||||||
|
5984
|
||||||
|
5957
|
||||||
|
5892
|
||||||
|
5856
|
||||||
|
5959
|
||||||
|
5957
|
||||||
|
5794
|
||||||
|
5894
|
||||||
|
5859
|
||||||
|
5632
|
||||||
|
show status like 'handler_read%';
|
||||||
|
Variable_name Value
|
||||||
|
Handler_read_first 0
|
||||||
|
Handler_read_key 21
|
||||||
|
Handler_read_next 0
|
||||||
|
Handler_read_prev 0
|
||||||
|
Handler_read_rnd 0
|
||||||
|
Handler_read_rnd_next 0
|
||||||
|
set optimizer_switch='extended_keys=off';
|
||||||
|
explain
|
||||||
|
select max(l_orderkey) from lineitem
|
||||||
|
where l_suppkey in (1,4) group by l_suppkey;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE lineitem range i_l_suppkey i_l_suppkey 5 NULL # Using where; Using index
|
||||||
|
flush status;
|
||||||
|
select max(l_orderkey) from lineitem
|
||||||
|
where l_suppkey in (1,4) group by l_suppkey;
|
||||||
|
max(l_orderkey)
|
||||||
|
5988
|
||||||
|
5984
|
||||||
|
show status like 'handler_read%';
|
||||||
|
Variable_name Value
|
||||||
|
Handler_read_first 0
|
||||||
|
Handler_read_key 2
|
||||||
|
Handler_read_next 1230
|
||||||
|
Handler_read_prev 0
|
||||||
|
Handler_read_rnd 0
|
||||||
|
Handler_read_rnd_next 0
|
||||||
|
set optimizer_switch='extended_keys=on';
|
||||||
|
explain
|
||||||
|
select max(l_orderkey) from lineitem
|
||||||
|
where l_suppkey in (1,4) group by l_suppkey;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE lineitem range i_l_suppkey i_l_suppkey 5 NULL # Using where; Using index for group-by
|
||||||
|
flush status;
|
||||||
|
select max(l_orderkey) from lineitem
|
||||||
|
where l_suppkey in (1,4) group by l_suppkey;
|
||||||
|
max(l_orderkey)
|
||||||
|
5988
|
||||||
|
5984
|
||||||
|
show status like 'handler_read%';
|
||||||
|
Variable_name Value
|
||||||
|
Handler_read_first 0
|
||||||
|
Handler_read_key 6
|
||||||
|
Handler_read_next 0
|
||||||
|
Handler_read_prev 0
|
||||||
|
Handler_read_rnd 0
|
||||||
|
Handler_read_rnd_next 0
|
||||||
|
create index i_p_retailprice on part(p_retailprice);
|
||||||
|
set optimizer_switch='extended_keys=off';
|
||||||
|
explain
|
||||||
|
select o_orderkey, p_partkey
|
||||||
|
from part use index (i_p_retailprice),
|
||||||
|
lineitem use index (i_l_partkey), orders
|
||||||
|
where p_retailprice > 1100 and o_orderdate='1997-01-01'
|
||||||
|
and o_orderkey=l_orderkey and p_partkey=l_partkey;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE part range i_p_retailprice i_p_retailprice 9 NULL # Using where; Using index
|
||||||
|
1 SIMPLE orders ref PRIMARY,i_o_orderdate i_o_orderdate 4 const # Using index
|
||||||
|
1 SIMPLE lineitem ref i_l_partkey i_l_partkey 5 dbt3_s001.part.p_partkey # Using where; Using index
|
||||||
|
flush status;
|
||||||
|
select o_orderkey, p_partkey
|
||||||
|
from part use index (i_p_retailprice),
|
||||||
|
lineitem use index (i_l_partkey), orders
|
||||||
|
where p_retailprice > 1100 and o_orderdate='1997-01-01'
|
||||||
|
and o_orderkey=l_orderkey and p_partkey=l_partkey;
|
||||||
|
o_orderkey p_partkey
|
||||||
|
5895 200
|
||||||
|
show status like 'handler_read%';
|
||||||
|
Variable_name Value
|
||||||
|
Handler_read_first 0
|
||||||
|
Handler_read_key 3
|
||||||
|
Handler_read_next 26
|
||||||
|
Handler_read_prev 0
|
||||||
|
Handler_read_rnd 0
|
||||||
|
Handler_read_rnd_next 0
|
||||||
|
set optimizer_switch='extended_keys=on';
|
||||||
|
explain
|
||||||
|
select o_orderkey, p_partkey
|
||||||
|
from part use index (i_p_retailprice),
|
||||||
|
lineitem use index (i_l_partkey), orders
|
||||||
|
where p_retailprice > 1100 and o_orderdate='1997-01-01'
|
||||||
|
and o_orderkey=l_orderkey and p_partkey=l_partkey;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE part range i_p_retailprice i_p_retailprice 9 NULL # Using where; Using index
|
||||||
|
1 SIMPLE orders ref PRIMARY,i_o_orderdate i_o_orderdate 4 const # Using index
|
||||||
|
1 SIMPLE lineitem ref i_l_partkey i_l_partkey 9 dbt3_s001.part.p_partkey,dbt3_s001.orders.o_orderkey # Using index
|
||||||
|
flush status;
|
||||||
|
select o_orderkey, p_partkey
|
||||||
|
from part use index (i_p_retailprice),
|
||||||
|
lineitem use index (i_l_partkey), orders
|
||||||
|
where p_retailprice > 1100 and o_orderdate='1997-01-01'
|
||||||
|
and o_orderkey=l_orderkey and p_partkey=l_partkey;
|
||||||
|
o_orderkey p_partkey
|
||||||
|
5895 200
|
||||||
|
show status like 'handler_read%';
|
||||||
|
Variable_name Value
|
||||||
|
Handler_read_first 0
|
||||||
|
Handler_read_key 3
|
||||||
|
Handler_read_next 3
|
||||||
|
Handler_read_prev 0
|
||||||
|
Handler_read_rnd 0
|
||||||
|
Handler_read_rnd_next 0
|
||||||
|
set optimizer_switch=@save_ext_key_optimizer_switch;
|
||||||
|
DROP DATABASE dbt3_s001;
|
||||||
|
SET SESSION STORAGE_ENGINE=DEFAULT;
|
|
@ -4,19 +4,19 @@
|
||||||
#
|
#
|
||||||
select @@optimizer_switch;
|
select @@optimizer_switch;
|
||||||
@@optimizer_switch
|
@@optimizer_switch
|
||||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off
|
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off,extended_keys=off
|
||||||
set optimizer_switch='index_merge=off,index_merge_union=off';
|
set optimizer_switch='index_merge=off,index_merge_union=off';
|
||||||
select @@optimizer_switch;
|
select @@optimizer_switch;
|
||||||
@@optimizer_switch
|
@@optimizer_switch
|
||||||
index_merge=off,index_merge_union=off,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off
|
index_merge=off,index_merge_union=off,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off,extended_keys=off
|
||||||
set optimizer_switch='index_merge_union=on';
|
set optimizer_switch='index_merge_union=on';
|
||||||
select @@optimizer_switch;
|
select @@optimizer_switch;
|
||||||
@@optimizer_switch
|
@@optimizer_switch
|
||||||
index_merge=off,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off
|
index_merge=off,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off,extended_keys=off
|
||||||
set optimizer_switch='default,index_merge_sort_union=off';
|
set optimizer_switch='default,index_merge_sort_union=off';
|
||||||
select @@optimizer_switch;
|
select @@optimizer_switch;
|
||||||
@@optimizer_switch
|
@@optimizer_switch
|
||||||
index_merge=on,index_merge_union=on,index_merge_sort_union=off,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off
|
index_merge=on,index_merge_union=on,index_merge_sort_union=off,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off,extended_keys=off
|
||||||
set optimizer_switch=4;
|
set optimizer_switch=4;
|
||||||
ERROR 42000: Variable 'optimizer_switch' can't be set to the value of '4'
|
ERROR 42000: Variable 'optimizer_switch' can't be set to the value of '4'
|
||||||
set optimizer_switch=NULL;
|
set optimizer_switch=NULL;
|
||||||
|
@ -43,60 +43,60 @@ set optimizer_switch=default;
|
||||||
set optimizer_switch='index_merge=off,index_merge_union=off,default';
|
set optimizer_switch='index_merge=off,index_merge_union=off,default';
|
||||||
select @@optimizer_switch;
|
select @@optimizer_switch;
|
||||||
@@optimizer_switch
|
@@optimizer_switch
|
||||||
index_merge=off,index_merge_union=off,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off
|
index_merge=off,index_merge_union=off,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off,extended_keys=off
|
||||||
set optimizer_switch=default;
|
set optimizer_switch=default;
|
||||||
select @@global.optimizer_switch;
|
select @@global.optimizer_switch;
|
||||||
@@global.optimizer_switch
|
@@global.optimizer_switch
|
||||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off
|
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off,extended_keys=off
|
||||||
set @@global.optimizer_switch=default;
|
set @@global.optimizer_switch=default;
|
||||||
select @@global.optimizer_switch;
|
select @@global.optimizer_switch;
|
||||||
@@global.optimizer_switch
|
@@global.optimizer_switch
|
||||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off
|
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off,extended_keys=off
|
||||||
#
|
#
|
||||||
# Check index_merge's @@optimizer_switch flags
|
# Check index_merge's @@optimizer_switch flags
|
||||||
#
|
#
|
||||||
select @@optimizer_switch;
|
select @@optimizer_switch;
|
||||||
@@optimizer_switch
|
@@optimizer_switch
|
||||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off
|
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off,extended_keys=off
|
||||||
|
|
||||||
BUG#37120 optimizer_switch allowable values not according to specification
|
BUG#37120 optimizer_switch allowable values not according to specification
|
||||||
|
|
||||||
select @@optimizer_switch;
|
select @@optimizer_switch;
|
||||||
@@optimizer_switch
|
@@optimizer_switch
|
||||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off
|
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off,extended_keys=off
|
||||||
set optimizer_switch='default,materialization=off';
|
set optimizer_switch='default,materialization=off';
|
||||||
select @@optimizer_switch;
|
select @@optimizer_switch;
|
||||||
@@optimizer_switch
|
@@optimizer_switch
|
||||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off
|
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off,extended_keys=off
|
||||||
set optimizer_switch='default,semijoin=off';
|
set optimizer_switch='default,semijoin=off';
|
||||||
select @@optimizer_switch;
|
select @@optimizer_switch;
|
||||||
@@optimizer_switch
|
@@optimizer_switch
|
||||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off
|
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off,extended_keys=off
|
||||||
set optimizer_switch='default,loosescan=off';
|
set optimizer_switch='default,loosescan=off';
|
||||||
select @@optimizer_switch;
|
select @@optimizer_switch;
|
||||||
@@optimizer_switch
|
@@optimizer_switch
|
||||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off
|
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off,extended_keys=off
|
||||||
set optimizer_switch='default,semijoin=off,materialization=off';
|
set optimizer_switch='default,semijoin=off,materialization=off';
|
||||||
select @@optimizer_switch;
|
select @@optimizer_switch;
|
||||||
@@optimizer_switch
|
@@optimizer_switch
|
||||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off
|
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off,extended_keys=off
|
||||||
set optimizer_switch='default,materialization=off,semijoin=off';
|
set optimizer_switch='default,materialization=off,semijoin=off';
|
||||||
select @@optimizer_switch;
|
select @@optimizer_switch;
|
||||||
@@optimizer_switch
|
@@optimizer_switch
|
||||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off
|
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off,extended_keys=off
|
||||||
set optimizer_switch='default,semijoin=off,materialization=off,loosescan=off';
|
set optimizer_switch='default,semijoin=off,materialization=off,loosescan=off';
|
||||||
select @@optimizer_switch;
|
select @@optimizer_switch;
|
||||||
@@optimizer_switch
|
@@optimizer_switch
|
||||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off
|
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off,extended_keys=off
|
||||||
set optimizer_switch='default,semijoin=off,loosescan=off';
|
set optimizer_switch='default,semijoin=off,loosescan=off';
|
||||||
select @@optimizer_switch;
|
select @@optimizer_switch;
|
||||||
@@optimizer_switch
|
@@optimizer_switch
|
||||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off
|
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off,extended_keys=off
|
||||||
set optimizer_switch='default,materialization=off,loosescan=off';
|
set optimizer_switch='default,materialization=off,loosescan=off';
|
||||||
select @@optimizer_switch;
|
select @@optimizer_switch;
|
||||||
@@optimizer_switch
|
@@optimizer_switch
|
||||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off
|
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off,extended_keys=off
|
||||||
set optimizer_switch=default;
|
set optimizer_switch=default;
|
||||||
select @@optimizer_switch;
|
select @@optimizer_switch;
|
||||||
@@optimizer_switch
|
@@optimizer_switch
|
||||||
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off
|
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off,extended_keys=off
|
||||||
|
|
294
mysql-test/t/innodb_ext_key.test
Normal file
294
mysql-test/t/innodb_ext_key.test
Normal file
|
@ -0,0 +1,294 @@
|
||||||
|
--source include/have_innodb.inc
|
||||||
|
|
||||||
|
--disable_warnings
|
||||||
|
DROP TABLE IF EXISTS t1,t2,t3,t4;
|
||||||
|
DROP DATABASE IF EXISTS dbt3_s001;
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
SET SESSION STORAGE_ENGINE='InnoDB';
|
||||||
|
|
||||||
|
CREATE DATABASE dbt3_s001;
|
||||||
|
|
||||||
|
use dbt3_s001;
|
||||||
|
|
||||||
|
--disable_query_log
|
||||||
|
--disable_result_log
|
||||||
|
--disable_warnings
|
||||||
|
--source include/dbt3_s001.inc
|
||||||
|
--enable_warnings
|
||||||
|
--enable_result_log
|
||||||
|
--enable_query_log
|
||||||
|
|
||||||
|
set @save_ext_key_optimizer_switch=@@optimizer_switch;
|
||||||
|
|
||||||
|
set optimizer_switch='extended_keys=off';
|
||||||
|
explain
|
||||||
|
select count(*) from lineitem where l_orderkey=130 and l_shipdate='1992-07-01';
|
||||||
|
flush status;
|
||||||
|
select count(*) from lineitem where l_orderkey=130 and l_shipdate='1992-07-01';
|
||||||
|
show status like 'handler_read%';
|
||||||
|
|
||||||
|
set optimizer_switch='extended_keys=on';
|
||||||
|
explain
|
||||||
|
select count(*) from lineitem where l_orderkey=130 and l_shipdate='1992-07-01';
|
||||||
|
flush status;
|
||||||
|
select count(*) from lineitem where l_orderkey=130 and l_shipdate='1992-07-01';
|
||||||
|
show status like 'handler_read%';
|
||||||
|
|
||||||
|
set optimizer_switch='extended_keys=off';
|
||||||
|
explain
|
||||||
|
select count(*) from lineitem
|
||||||
|
where l_orderkey=130 and l_linenumber=2 and l_shipdate='1992-07-01';
|
||||||
|
flush status;
|
||||||
|
select count(*) from lineitem
|
||||||
|
where l_orderkey=130 and l_linenumber=2 and l_shipdate='1992-07-01';
|
||||||
|
show status like 'handler_read%';
|
||||||
|
|
||||||
|
set optimizer_switch='extended_keys=on';
|
||||||
|
explain
|
||||||
|
select count(*) from lineitem
|
||||||
|
where l_orderkey=130 and l_linenumber=2 and l_shipdate='1992-07-01';
|
||||||
|
flush status;
|
||||||
|
select count(*) from lineitem
|
||||||
|
where l_orderkey=130 and l_linenumber=2 and l_shipdate='1992-07-01';
|
||||||
|
show status like 'handler_read%';
|
||||||
|
|
||||||
|
set optimizer_switch='extended_keys=off';
|
||||||
|
explain
|
||||||
|
select count(*) from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000;
|
||||||
|
flush status;
|
||||||
|
select count(*) from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000;
|
||||||
|
show status like 'handler_read%';
|
||||||
|
|
||||||
|
set optimizer_switch='extended_keys=on';
|
||||||
|
explain
|
||||||
|
select count(*) from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000;
|
||||||
|
flush status;
|
||||||
|
select count(*) from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000;
|
||||||
|
show status like 'handler_read%';
|
||||||
|
|
||||||
|
set optimizer_switch='extended_keys=off';
|
||||||
|
explain
|
||||||
|
select l_orderkey, l_linenumber from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1001 and 2000;
|
||||||
|
flush status;
|
||||||
|
select l_orderkey, l_linenumber from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1001 and 2000;
|
||||||
|
show status like 'handler_read%';
|
||||||
|
|
||||||
|
set optimizer_switch='extended_keys=on';
|
||||||
|
explain
|
||||||
|
select l_orderkey, l_linenumber from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1001 and 2000;
|
||||||
|
flush status;
|
||||||
|
select l_orderkey, l_linenumber from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1001 and 2000;
|
||||||
|
show status like 'handler_read%';
|
||||||
|
|
||||||
|
set optimizer_switch='extended_keys=off';
|
||||||
|
explain
|
||||||
|
select min(l_orderkey) from lineitem where l_shipdate='1992-07-01';
|
||||||
|
flush status;
|
||||||
|
select min(l_orderkey) from lineitem where l_shipdate='1992-07-01';
|
||||||
|
show status like 'handler_read%';
|
||||||
|
|
||||||
|
set optimizer_switch='extended_keys=on';
|
||||||
|
explain
|
||||||
|
select min(l_orderkey) from lineitem where l_shipdate='1992-07-01';
|
||||||
|
flush status;
|
||||||
|
select min(l_orderkey) from lineitem where l_shipdate='1992-07-01';
|
||||||
|
show status like 'handler_read%';
|
||||||
|
|
||||||
|
set optimizer_switch='extended_keys=off';
|
||||||
|
explain
|
||||||
|
select min(l_orderkey) from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1001 and 2000;
|
||||||
|
flush status;
|
||||||
|
select min(l_orderkey) from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1001 and 2000;
|
||||||
|
show status like 'handler_read%';
|
||||||
|
|
||||||
|
set optimizer_switch='extended_keys=on';
|
||||||
|
explain
|
||||||
|
select min(l_orderkey) from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1001 and 2000;
|
||||||
|
flush status;
|
||||||
|
select min(l_orderkey) from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1001 and 2000;
|
||||||
|
show status like 'handler_read%';
|
||||||
|
|
||||||
|
set optimizer_switch='extended_keys=off';
|
||||||
|
explain
|
||||||
|
select max(l_linenumber) from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey=130;
|
||||||
|
flush status;
|
||||||
|
select max(l_linenumber) from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey=130;
|
||||||
|
show status like 'handler_read%';
|
||||||
|
|
||||||
|
set optimizer_switch='extended_keys=on';
|
||||||
|
explain
|
||||||
|
select max(l_linenumber) from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey=130;
|
||||||
|
flush status;
|
||||||
|
select max(l_linenumber) from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey=130;
|
||||||
|
show status like 'handler_read%';
|
||||||
|
|
||||||
|
set optimizer_switch='extended_keys=off';
|
||||||
|
explain
|
||||||
|
select l_orderkey, l_linenumber
|
||||||
|
from lineitem use index (i_l_shipdate, i_l_receiptdate)
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey=130
|
||||||
|
or l_receiptdate='1992-07-01' and l_orderkey=5603;
|
||||||
|
flush status;
|
||||||
|
select l_orderkey, l_linenumber
|
||||||
|
from lineitem use index (i_l_shipdate, i_l_receiptdate)
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey=130
|
||||||
|
or l_receiptdate='1992-07-01' and l_orderkey=5603;
|
||||||
|
show status like 'handler_read%';
|
||||||
|
|
||||||
|
set optimizer_switch='extended_keys=on';
|
||||||
|
explain
|
||||||
|
select l_orderkey, l_linenumber
|
||||||
|
from lineitem use index (i_l_shipdate, i_l_receiptdate)
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey=130
|
||||||
|
or l_receiptdate='1992-07-01' and l_orderkey=5603;
|
||||||
|
flush status;
|
||||||
|
select l_orderkey, l_linenumber
|
||||||
|
from lineitem use index (i_l_shipdate, i_l_receiptdate)
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey=130
|
||||||
|
or l_receiptdate='1992-07-01' and l_orderkey=5603;
|
||||||
|
show status like 'handler_read%';
|
||||||
|
|
||||||
|
set optimizer_switch='extended_keys=off';
|
||||||
|
explain
|
||||||
|
select l_orderkey, l_linenumber
|
||||||
|
from lineitem use index (i_l_shipdate, i_l_receiptdate)
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000
|
||||||
|
or l_receiptdate='1992-07-01' and l_orderkey between 5001 and 6000;
|
||||||
|
flush status;
|
||||||
|
select l_orderkey, l_linenumber
|
||||||
|
from lineitem use index (i_l_shipdate, i_l_receiptdate)
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000
|
||||||
|
or l_receiptdate='1992-07-01' and l_orderkey between 5001 and 6000;
|
||||||
|
show status like 'handler_read%';
|
||||||
|
|
||||||
|
set optimizer_switch='extended_keys=on';
|
||||||
|
explain
|
||||||
|
select l_orderkey, l_linenumber
|
||||||
|
from lineitem use index (i_l_shipdate, i_l_receiptdate)
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000
|
||||||
|
or l_receiptdate='1992-07-01' and l_orderkey between 5001 and 6000;
|
||||||
|
flush status;
|
||||||
|
select l_orderkey, l_linenumber
|
||||||
|
from lineitem use index (i_l_shipdate, i_l_receiptdate)
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000
|
||||||
|
or l_receiptdate='1992-07-01' and l_orderkey between 5001 and 6000;
|
||||||
|
show status like 'handler_read%';
|
||||||
|
|
||||||
|
set optimizer_switch='extended_keys=off';
|
||||||
|
explain
|
||||||
|
select l_orderkey, l_linenumber from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000
|
||||||
|
or l_receiptdate='1992-07-01' and l_orderkey between 5001 and 6000;
|
||||||
|
flush status;
|
||||||
|
select l_orderkey, l_linenumber from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000
|
||||||
|
or l_receiptdate='1992-07-01' and l_orderkey between 5001 and 6000;
|
||||||
|
show status like 'handler_read%';
|
||||||
|
|
||||||
|
set optimizer_switch='extended_keys=on';
|
||||||
|
explain
|
||||||
|
select l_orderkey, l_linenumber from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000
|
||||||
|
or l_receiptdate='1992-07-01' and l_orderkey between 5001 and 6000;
|
||||||
|
flush status;
|
||||||
|
select l_orderkey, l_linenumber from lineitem
|
||||||
|
where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000
|
||||||
|
or l_receiptdate='1992-07-01' and l_orderkey between 5001 and 6000;
|
||||||
|
show status like 'handler_read%';
|
||||||
|
|
||||||
|
set optimizer_switch='extended_keys=off';
|
||||||
|
--replace_column 9 #
|
||||||
|
explain
|
||||||
|
select max(l_orderkey) from lineitem
|
||||||
|
where l_partkey between 1 and 10 group by l_partkey;
|
||||||
|
flush status;
|
||||||
|
select max(l_orderkey) from lineitem
|
||||||
|
where l_partkey between 1 and 10 group by l_partkey;
|
||||||
|
show status like 'handler_read%';
|
||||||
|
|
||||||
|
set optimizer_switch='extended_keys=on';
|
||||||
|
--replace_column 9 #
|
||||||
|
explain
|
||||||
|
select max(l_orderkey) from lineitem
|
||||||
|
where l_partkey between 1 and 10 group by l_partkey;
|
||||||
|
flush status;
|
||||||
|
select max(l_orderkey) from lineitem
|
||||||
|
where l_partkey between 1 and 10 group by l_partkey;
|
||||||
|
show status like 'handler_read%';
|
||||||
|
|
||||||
|
set optimizer_switch='extended_keys=off';
|
||||||
|
--replace_column 9 #
|
||||||
|
explain
|
||||||
|
select max(l_orderkey) from lineitem
|
||||||
|
where l_suppkey in (1,4) group by l_suppkey;
|
||||||
|
flush status;
|
||||||
|
select max(l_orderkey) from lineitem
|
||||||
|
where l_suppkey in (1,4) group by l_suppkey;
|
||||||
|
show status like 'handler_read%';
|
||||||
|
|
||||||
|
set optimizer_switch='extended_keys=on';
|
||||||
|
--replace_column 9 #
|
||||||
|
explain
|
||||||
|
select max(l_orderkey) from lineitem
|
||||||
|
where l_suppkey in (1,4) group by l_suppkey;
|
||||||
|
flush status;
|
||||||
|
select max(l_orderkey) from lineitem
|
||||||
|
where l_suppkey in (1,4) group by l_suppkey;
|
||||||
|
show status like 'handler_read%';
|
||||||
|
|
||||||
|
create index i_p_retailprice on part(p_retailprice);
|
||||||
|
|
||||||
|
set optimizer_switch='extended_keys=off';
|
||||||
|
--replace_column 9 #
|
||||||
|
explain
|
||||||
|
select o_orderkey, p_partkey
|
||||||
|
from part use index (i_p_retailprice),
|
||||||
|
lineitem use index (i_l_partkey), orders
|
||||||
|
where p_retailprice > 1100 and o_orderdate='1997-01-01'
|
||||||
|
and o_orderkey=l_orderkey and p_partkey=l_partkey;
|
||||||
|
flush status;
|
||||||
|
select o_orderkey, p_partkey
|
||||||
|
from part use index (i_p_retailprice),
|
||||||
|
lineitem use index (i_l_partkey), orders
|
||||||
|
where p_retailprice > 1100 and o_orderdate='1997-01-01'
|
||||||
|
and o_orderkey=l_orderkey and p_partkey=l_partkey;
|
||||||
|
show status like 'handler_read%';
|
||||||
|
|
||||||
|
set optimizer_switch='extended_keys=on';
|
||||||
|
--replace_column 9 #
|
||||||
|
explain
|
||||||
|
select o_orderkey, p_partkey
|
||||||
|
from part use index (i_p_retailprice),
|
||||||
|
lineitem use index (i_l_partkey), orders
|
||||||
|
where p_retailprice > 1100 and o_orderdate='1997-01-01'
|
||||||
|
and o_orderkey=l_orderkey and p_partkey=l_partkey;
|
||||||
|
flush status;
|
||||||
|
select o_orderkey, p_partkey
|
||||||
|
from part use index (i_p_retailprice),
|
||||||
|
lineitem use index (i_l_partkey), orders
|
||||||
|
where p_retailprice > 1100 and o_orderdate='1997-01-01'
|
||||||
|
and o_orderkey=l_orderkey and p_partkey=l_partkey;
|
||||||
|
show status like 'handler_read%';
|
||||||
|
|
||||||
|
set optimizer_switch=@save_ext_key_optimizer_switch;
|
||||||
|
|
||||||
|
DROP DATABASE dbt3_s001;
|
||||||
|
|
||||||
|
SET SESSION STORAGE_ENGINE=DEFAULT;
|
|
@ -590,7 +590,8 @@ protected:
|
||||||
#define OPTIMIZER_SWITCH_JOIN_CACHE_BKA (1ULL << 23)
|
#define OPTIMIZER_SWITCH_JOIN_CACHE_BKA (1ULL << 23)
|
||||||
#define OPTIMIZER_SWITCH_OPTIMIZE_JOIN_BUFFER_SIZE (1ULL << 24)
|
#define OPTIMIZER_SWITCH_OPTIMIZE_JOIN_BUFFER_SIZE (1ULL << 24)
|
||||||
#define OPTIMIZER_SWITCH_TABLE_ELIMINATION (1ULL << 25)
|
#define OPTIMIZER_SWITCH_TABLE_ELIMINATION (1ULL << 25)
|
||||||
#define OPTIMIZER_SWITCH_LAST (1ULL << 26)
|
#define OPTIMIZER_SWITCH_EXTENDED_KEYS (1ULL << 26)
|
||||||
|
#define OPTIMIZER_SWITCH_LAST (1ULL << 27)
|
||||||
|
|
||||||
/* The following must be kept in sync with optimizer_switch_str in mysqld.cc */
|
/* The following must be kept in sync with optimizer_switch_str in mysqld.cc */
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -351,6 +351,7 @@ static const char *optimizer_switch_names[]=
|
||||||
"join_cache_bka",
|
"join_cache_bka",
|
||||||
"optimize_join_buffer_size",
|
"optimize_join_buffer_size",
|
||||||
"table_elimination",
|
"table_elimination",
|
||||||
|
"extended_keys",
|
||||||
"default", NullS
|
"default", NullS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -383,6 +384,7 @@ static const unsigned int optimizer_switch_names_len[]=
|
||||||
sizeof("join_cache_bka") - 1,
|
sizeof("join_cache_bka") - 1,
|
||||||
sizeof("optimize_join_buffer_size") - 1,
|
sizeof("optimize_join_buffer_size") - 1,
|
||||||
sizeof("table_elimination") - 1,
|
sizeof("table_elimination") - 1,
|
||||||
|
sizeof("extended_keys") - 1,
|
||||||
sizeof("default") - 1
|
sizeof("default") - 1
|
||||||
};
|
};
|
||||||
TYPELIB optimizer_switch_typelib= { array_elements(optimizer_switch_names)-1,"",
|
TYPELIB optimizer_switch_typelib= { array_elements(optimizer_switch_names)-1,"",
|
||||||
|
@ -499,8 +501,8 @@ static const char *optimizer_switch_str="index_merge=on,index_merge_union=on,"
|
||||||
"join_cache_hashed=on,"
|
"join_cache_hashed=on,"
|
||||||
"join_cache_bka=on,"
|
"join_cache_bka=on,"
|
||||||
"optimize_join_buffer_size=off,"
|
"optimize_join_buffer_size=off,"
|
||||||
"table_elimination=on";
|
"table_elimination=on,"
|
||||||
;
|
"extended_keys=off";
|
||||||
#ifdef SAFEMALLOC
|
#ifdef SAFEMALLOC
|
||||||
my_bool sf_malloc_trough_check= 0;
|
my_bool sf_malloc_trough_check= 0;
|
||||||
#endif
|
#endif
|
||||||
|
@ -7565,7 +7567,7 @@ each time the SQL thread starts.",
|
||||||
"subquery_cache, outer_join_with_cache, semijoin_with_cache, "
|
"subquery_cache, outer_join_with_cache, semijoin_with_cache, "
|
||||||
"join_cache_incremental, join_cache_hashed, join_cache_bka, "
|
"join_cache_incremental, join_cache_hashed, join_cache_bka, "
|
||||||
"optimize_join_buffer_size"
|
"optimize_join_buffer_size"
|
||||||
", table_elimination"
|
", table_elimination, extended_keys"
|
||||||
"} and val={on, off, default}.",
|
"} and val={on, off, default}.",
|
||||||
&optimizer_switch_str, &optimizer_switch_str, 0, GET_STR, REQUIRED_ARG,
|
&optimizer_switch_str, &optimizer_switch_str, 0, GET_STR, REQUIRED_ARG,
|
||||||
/*OPTIMIZER_SWITCH_DEFAULT*/0, 0, 0, 0, 0, 0},
|
/*OPTIMIZER_SWITCH_DEFAULT*/0, 0, 0, 0, 0, 0},
|
||||||
|
|
|
@ -2977,9 +2977,10 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use,
|
||||||
|
|
||||||
thd->no_errors=1; // Don't warn about NULL
|
thd->no_errors=1; // Don't warn about NULL
|
||||||
init_sql_alloc(&alloc, thd->variables.range_alloc_block_size, 0);
|
init_sql_alloc(&alloc, thd->variables.range_alloc_block_size, 0);
|
||||||
if (!(param.key_parts= (KEY_PART*) alloc_root(&alloc,
|
if (!(param.key_parts=
|
||||||
sizeof(KEY_PART)*
|
(KEY_PART*) alloc_root(&alloc,
|
||||||
head->s->key_parts)) ||
|
sizeof(KEY_PART)*
|
||||||
|
head->s->actual_n_key_parts(thd))) ||
|
||||||
fill_used_fields_bitmap(¶m))
|
fill_used_fields_bitmap(¶m))
|
||||||
{
|
{
|
||||||
thd->no_errors=0;
|
thd->no_errors=0;
|
||||||
|
@ -2997,6 +2998,8 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use,
|
||||||
for (idx=0 ; idx < head->s->keys ; idx++, key_info++)
|
for (idx=0 ; idx < head->s->keys ; idx++, key_info++)
|
||||||
{
|
{
|
||||||
KEY_PART_INFO *key_part_info;
|
KEY_PART_INFO *key_part_info;
|
||||||
|
uint n_key_parts= head->actual_n_key_parts(key_info);
|
||||||
|
|
||||||
if (!keys_to_use.is_set(idx))
|
if (!keys_to_use.is_set(idx))
|
||||||
continue;
|
continue;
|
||||||
if (key_info->flags & HA_FULLTEXT)
|
if (key_info->flags & HA_FULLTEXT)
|
||||||
|
@ -3004,9 +3007,9 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use,
|
||||||
|
|
||||||
param.key[param.keys]=key_parts;
|
param.key[param.keys]=key_parts;
|
||||||
key_part_info= key_info->key_part;
|
key_part_info= key_info->key_part;
|
||||||
for (uint part=0 ; part < key_info->key_parts ;
|
for (uint part= 0 ; part < n_key_parts ;
|
||||||
part++, key_parts++, key_part_info++)
|
part++, key_parts++, key_part_info++)
|
||||||
{
|
{
|
||||||
key_parts->key= param.keys;
|
key_parts->key= param.keys;
|
||||||
key_parts->part= part;
|
key_parts->part= part;
|
||||||
key_parts->length= key_part_info->length;
|
key_parts->length= key_part_info->length;
|
||||||
|
@ -10017,13 +10020,14 @@ get_quick_select(PARAM *param,uint idx,SEL_ARG *key_tree, uint mrr_flags,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
KEY *keyinfo= param->table->key_info+param->real_keynr[idx];
|
||||||
quick->mrr_flags= mrr_flags;
|
quick->mrr_flags= mrr_flags;
|
||||||
quick->mrr_buf_size= mrr_buf_size;
|
quick->mrr_buf_size= mrr_buf_size;
|
||||||
quick->key_parts=(KEY_PART*)
|
quick->key_parts=(KEY_PART*)
|
||||||
memdup_root(parent_alloc? parent_alloc : &quick->alloc,
|
memdup_root(parent_alloc? parent_alloc : &quick->alloc,
|
||||||
(char*) param->key[idx],
|
(char*) param->key[idx],
|
||||||
sizeof(KEY_PART)*
|
sizeof(KEY_PART)*
|
||||||
param->table->key_info[param->real_keynr[idx]].key_parts);
|
param->table->actual_n_key_parts(keyinfo));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DBUG_RETURN(quick);
|
DBUG_RETURN(quick);
|
||||||
|
@ -11681,6 +11685,7 @@ get_best_group_min_max(PARAM *param, SEL_TREE *tree)
|
||||||
KEY_PART_INFO *last_part;
|
KEY_PART_INFO *last_part;
|
||||||
KEY_PART_INFO *first_non_group_part;
|
KEY_PART_INFO *first_non_group_part;
|
||||||
KEY_PART_INFO *first_non_infix_part;
|
KEY_PART_INFO *first_non_infix_part;
|
||||||
|
uint key_parts;
|
||||||
uint key_infix_parts;
|
uint key_infix_parts;
|
||||||
uint cur_group_key_parts= 0;
|
uint cur_group_key_parts= 0;
|
||||||
uint cur_group_prefix_len= 0;
|
uint cur_group_prefix_len= 0;
|
||||||
|
@ -11695,7 +11700,8 @@ get_best_group_min_max(PARAM *param, SEL_TREE *tree)
|
||||||
if (!table->covering_keys.is_set(cur_index))
|
if (!table->covering_keys.is_set(cur_index))
|
||||||
goto next_index;
|
goto next_index;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Unless extended keys can be used for cur_index:
|
||||||
If the current storage manager is such that it appends the primary key to
|
If the current storage manager is such that it appends the primary key to
|
||||||
each index, then the above condition is insufficient to check if the
|
each index, then the above condition is insufficient to check if the
|
||||||
index is covering. In such cases it may happen that some fields are
|
index is covering. In such cases it may happen that some fields are
|
||||||
|
@ -11704,7 +11710,8 @@ get_best_group_min_max(PARAM *param, SEL_TREE *tree)
|
||||||
does not qualify as covering in our case. If this is the case, below
|
does not qualify as covering in our case. If this is the case, below
|
||||||
we check that all query fields are indeed covered by 'cur_index'.
|
we check that all query fields are indeed covered by 'cur_index'.
|
||||||
*/
|
*/
|
||||||
if (pk < MAX_KEY && cur_index != pk &&
|
if (cur_index_info->key_parts==table->actual_n_key_parts(cur_index_info) &&
|
||||||
|
pk < MAX_KEY && cur_index != pk &&
|
||||||
(table->file->ha_table_flags() & HA_PRIMARY_KEY_IN_READ_INDEX))
|
(table->file->ha_table_flags() & HA_PRIMARY_KEY_IN_READ_INDEX))
|
||||||
{
|
{
|
||||||
/* For each table field */
|
/* For each table field */
|
||||||
|
@ -11721,13 +11728,14 @@ get_best_group_min_max(PARAM *param, SEL_TREE *tree)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Check (GA1) for GROUP BY queries.
|
Check (GA1) for GROUP BY queries.
|
||||||
*/
|
*/
|
||||||
if (join->group_list)
|
if (join->group_list)
|
||||||
{
|
{
|
||||||
cur_part= cur_index_info->key_part;
|
cur_part= cur_index_info->key_part;
|
||||||
end_part= cur_part + cur_index_info->key_parts;
|
end_part= cur_part + table->actual_n_key_parts(cur_index_info);
|
||||||
/* Iterate in parallel over the GROUP list and the index parts. */
|
/* Iterate in parallel over the GROUP list and the index parts. */
|
||||||
for (tmp_group= join->group_list; tmp_group && (cur_part != end_part);
|
for (tmp_group= join->group_list; tmp_group && (cur_part != end_part);
|
||||||
tmp_group= tmp_group->next, cur_part++)
|
tmp_group= tmp_group->next, cur_part++)
|
||||||
|
@ -11820,10 +11828,11 @@ get_best_group_min_max(PARAM *param, SEL_TREE *tree)
|
||||||
If there is no MIN/MAX, the keyparts after the last group part can be
|
If there is no MIN/MAX, the keyparts after the last group part can be
|
||||||
referenced only in equalities with constants, and the referenced keyparts
|
referenced only in equalities with constants, and the referenced keyparts
|
||||||
must form a sequence without any gaps that starts immediately after the
|
must form a sequence without any gaps that starts immediately after the
|
||||||
last group keypart.
|
last group keyparyt.
|
||||||
*/
|
*/
|
||||||
last_part= cur_index_info->key_part + cur_index_info->key_parts;
|
key_parts= table->actual_n_key_parts(cur_index_info);
|
||||||
first_non_group_part= (cur_group_key_parts < cur_index_info->key_parts) ?
|
last_part= cur_index_info->key_part + key_parts;
|
||||||
|
first_non_group_part= (cur_group_key_parts < key_parts) ?
|
||||||
cur_index_info->key_part + cur_group_key_parts :
|
cur_index_info->key_part + cur_group_key_parts :
|
||||||
NULL;
|
NULL;
|
||||||
first_non_infix_part= min_max_arg_part ?
|
first_non_infix_part= min_max_arg_part ?
|
||||||
|
@ -12273,7 +12282,8 @@ get_field_keypart(KEY *index, Field *field)
|
||||||
{
|
{
|
||||||
KEY_PART_INFO *part, *end;
|
KEY_PART_INFO *part, *end;
|
||||||
|
|
||||||
for (part= index->key_part, end= part + index->key_parts; part < end; part++)
|
for (part= index->key_part, end= part+field->table->actual_n_key_parts(index);
|
||||||
|
part < end; part++)
|
||||||
{
|
{
|
||||||
if (field->eq(part->field))
|
if (field->eq(part->field))
|
||||||
return part - index->key_part + 1;
|
return part - index->key_part + 1;
|
||||||
|
|
|
@ -845,7 +845,6 @@ static bool matching_cond(bool max_fl, TABLE_REF *ref, KEY *keyinfo,
|
||||||
In this case ref, range_fl and prefix_len are updated
|
In this case ref, range_fl and prefix_len are updated
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
static bool find_key_for_maxmin(bool max_fl, TABLE_REF *ref,
|
static bool find_key_for_maxmin(bool max_fl, TABLE_REF *ref,
|
||||||
Field* field, COND *cond,
|
Field* field, COND *cond,
|
||||||
uint *range_fl, uint *prefix_len)
|
uint *range_fl, uint *prefix_len)
|
||||||
|
@ -873,7 +872,8 @@ static bool find_key_for_maxmin(bool max_fl, TABLE_REF *ref,
|
||||||
continue;
|
continue;
|
||||||
uint jdx= 0;
|
uint jdx= 0;
|
||||||
*prefix_len= 0;
|
*prefix_len= 0;
|
||||||
for (part= keyinfo->key_part, part_end= part+keyinfo->key_parts ;
|
part_end= keyinfo->key_part+table->actual_n_key_parts(keyinfo);
|
||||||
|
for (part= keyinfo->key_part ;
|
||||||
part != part_end ;
|
part != part_end ;
|
||||||
part++, jdx++, key_part_to_use= (key_part_to_use << 1) | 1)
|
part++, jdx++, key_part_to_use= (key_part_to_use << 1) | 1)
|
||||||
{
|
{
|
||||||
|
|
|
@ -3339,11 +3339,13 @@ make_join_statistics(JOIN *join, List<TABLE_LIST> &tables_list,
|
||||||
The effect of this is that we don't do const substitution for
|
The effect of this is that we don't do const substitution for
|
||||||
such tables.
|
such tables.
|
||||||
*/
|
*/
|
||||||
if (eq_part.is_prefix(table->key_info[key].key_parts) &&
|
KEY *keyinfo= table->key_info+key;
|
||||||
|
uint key_parts= table->actual_n_key_parts(keyinfo);
|
||||||
|
if (eq_part.is_prefix(key_parts) &&
|
||||||
!table->fulltext_searched &&
|
!table->fulltext_searched &&
|
||||||
(!embedding || (embedding->sj_on_expr && !embedding->embedding)))
|
(!embedding || (embedding->sj_on_expr && !embedding->embedding)))
|
||||||
{
|
{
|
||||||
if (table->key_info[key].flags & HA_NOSAME)
|
if (table->actual_key_flags(keyinfo) & HA_NOSAME)
|
||||||
{
|
{
|
||||||
if (const_ref == eq_part &&
|
if (const_ref == eq_part &&
|
||||||
!has_expensive_keyparts &&
|
!has_expensive_keyparts &&
|
||||||
|
@ -4367,7 +4369,8 @@ add_key_part(DYNAMIC_ARRAY *keyuse_array, KEY_FIELD *key_field)
|
||||||
if (form->key_info[key].flags & (HA_FULLTEXT | HA_SPATIAL))
|
if (form->key_info[key].flags & (HA_FULLTEXT | HA_SPATIAL))
|
||||||
continue; // ToDo: ft-keys in non-ft queries. SerG
|
continue; // ToDo: ft-keys in non-ft queries. SerG
|
||||||
|
|
||||||
uint key_parts= (uint) form->key_info[key].key_parts;
|
KEY *keyinfo= form->key_info+key;
|
||||||
|
uint key_parts= form->actual_n_key_parts(keyinfo);
|
||||||
for (uint part=0 ; part < key_parts ; part++)
|
for (uint part=0 ; part < key_parts ; part++)
|
||||||
{
|
{
|
||||||
if (field->eq(form->key_info[key].key_part[part].field))
|
if (field->eq(form->key_info[key].key_part[part].field))
|
||||||
|
@ -4670,7 +4673,7 @@ update_ref_and_keys(THD *thd, DYNAMIC_ARRAY *keyuse,JOIN_TAB *join_tab,
|
||||||
/* fill keyuse with found key parts */
|
/* fill keyuse with found key parts */
|
||||||
for ( ; field != end ; field++)
|
for ( ; field != end ; field++)
|
||||||
{
|
{
|
||||||
if (add_key_part(keyuse,field))
|
if (add_key_part(keyuse, field))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4997,6 +5000,8 @@ best_access_path(JOIN *join,
|
||||||
for (keyuse=s->keyuse ; keyuse->table == table ;)
|
for (keyuse=s->keyuse ; keyuse->table == table ;)
|
||||||
{
|
{
|
||||||
KEY *keyinfo;
|
KEY *keyinfo;
|
||||||
|
ulong key_flags;
|
||||||
|
uint key_parts;
|
||||||
key_part_map found_part= 0;
|
key_part_map found_part= 0;
|
||||||
table_map found_ref= 0;
|
table_map found_ref= 0;
|
||||||
uint key= keyuse->key;
|
uint key= keyuse->key;
|
||||||
|
@ -5023,6 +5028,8 @@ best_access_path(JOIN *join,
|
||||||
}
|
}
|
||||||
|
|
||||||
keyinfo= table->key_info+key;
|
keyinfo= table->key_info+key;
|
||||||
|
key_parts= table->actual_n_key_parts(keyinfo);
|
||||||
|
key_flags= table->actual_key_flags(keyinfo);
|
||||||
|
|
||||||
/* Calculate how many key segments of the current key we can use */
|
/* Calculate how many key segments of the current key we can use */
|
||||||
start_key= keyuse;
|
start_key= keyuse;
|
||||||
|
@ -5101,11 +5108,11 @@ best_access_path(JOIN *join,
|
||||||
loose_scan_opt.check_ref_access_part1(s, key, start_key, found_part);
|
loose_scan_opt.check_ref_access_part1(s, key, start_key, found_part);
|
||||||
|
|
||||||
/* Check if we found full key */
|
/* Check if we found full key */
|
||||||
if (found_part == PREV_BITS(uint,keyinfo->key_parts) &&
|
if (found_part == PREV_BITS(uint, key_parts) &&
|
||||||
!ref_or_null_part)
|
!ref_or_null_part)
|
||||||
{ /* use eq key */
|
{ /* use eq key */
|
||||||
max_key_part= (uint) ~0;
|
max_key_part= (uint) ~0;
|
||||||
if ((keyinfo->flags & (HA_NOSAME | HA_NULL_PART_KEY)) == HA_NOSAME)
|
if ((key_flags & (HA_NOSAME | HA_NULL_PART_KEY)) == HA_NOSAME)
|
||||||
{
|
{
|
||||||
tmp = prev_record_reads(join->positions, idx, found_ref);
|
tmp = prev_record_reads(join->positions, idx, found_ref);
|
||||||
records=1.0;
|
records=1.0;
|
||||||
|
@ -7196,6 +7203,7 @@ static bool create_hj_key_for_table(JOIN *join, JOIN_TAB *join_tab,
|
||||||
key_parts)))
|
key_parts)))
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
keyinfo->usable_key_parts= keyinfo->key_parts = key_parts;
|
keyinfo->usable_key_parts= keyinfo->key_parts = key_parts;
|
||||||
|
keyinfo->ext_key_parts= keyinfo->key_parts;
|
||||||
keyinfo->key_part= key_part_info;
|
keyinfo->key_part= key_part_info;
|
||||||
keyinfo->key_length=0;
|
keyinfo->key_length=0;
|
||||||
keyinfo->algorithm= HA_KEY_ALG_UNDEF;
|
keyinfo->algorithm= HA_KEY_ALG_UNDEF;
|
||||||
|
@ -7403,8 +7411,11 @@ static bool create_ref_for_key(JOIN *join, JOIN_TAB *j,
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
if (j->type == JT_CONST)
|
if (j->type == JT_CONST)
|
||||||
j->table->const_table= 1;
|
j->table->const_table= 1;
|
||||||
else if (((keyinfo->flags & (HA_NOSAME | HA_NULL_PART_KEY)) != HA_NOSAME) ||
|
else if (((j->table->actual_key_flags(keyinfo) &
|
||||||
keyparts != keyinfo->key_parts || null_ref_key)
|
(HA_NOSAME | HA_NULL_PART_KEY))
|
||||||
|
!= HA_NOSAME) ||
|
||||||
|
keyparts != j->table->actual_n_key_parts(keyinfo) ||
|
||||||
|
null_ref_key)
|
||||||
{
|
{
|
||||||
/* Must read with repeat */
|
/* Must read with repeat */
|
||||||
j->type= null_ref_key ? JT_REF_OR_NULL : JT_REF;
|
j->type= null_ref_key ? JT_REF_OR_NULL : JT_REF;
|
||||||
|
|
|
@ -77,6 +77,9 @@ typedef struct st_key {
|
||||||
ulong flags; /* dupp key and pack flags */
|
ulong flags; /* dupp key and pack flags */
|
||||||
uint key_parts; /* How many key_parts */
|
uint key_parts; /* How many key_parts */
|
||||||
uint usable_key_parts; /* Should normally be = key_parts */
|
uint usable_key_parts; /* Should normally be = key_parts */
|
||||||
|
uint ext_key_parts; /* Number of key parts in extended key */
|
||||||
|
ulong ext_key_flags; /* Flags for extended key */
|
||||||
|
key_part_map ext_key_part_map; /* Bitmap of pk key parts in extension */
|
||||||
uint block_size;
|
uint block_size;
|
||||||
uint name_length;
|
uint name_length;
|
||||||
enum ha_key_alg algorithm;
|
enum ha_key_alg algorithm;
|
||||||
|
|
236
sql/table.cc
236
sql/table.cc
|
@ -705,6 +705,13 @@ static int open_binary_frm(THD *thd, TABLE_SHARE *share, uchar *head,
|
||||||
enum legacy_db_type legacy_db_type;
|
enum legacy_db_type legacy_db_type;
|
||||||
my_bitmap_map *bitmaps;
|
my_bitmap_map *bitmaps;
|
||||||
bool null_bits_are_used;
|
bool null_bits_are_used;
|
||||||
|
KEY first_keyinfo;
|
||||||
|
uint len;
|
||||||
|
KEY_PART_INFO *first_key_part= NULL;
|
||||||
|
uint ext_key_parts= 0;
|
||||||
|
uint first_key_parts= 0;
|
||||||
|
keyinfo= &first_keyinfo;
|
||||||
|
share->ext_key_parts= 0;
|
||||||
DBUG_ENTER("open_binary_frm");
|
DBUG_ENTER("open_binary_frm");
|
||||||
|
|
||||||
LINT_INIT(options);
|
LINT_INIT(options);
|
||||||
|
@ -798,18 +805,28 @@ static int open_binary_frm(THD *thd, TABLE_SHARE *share, uchar *head,
|
||||||
share->keys_for_keyread.init(0);
|
share->keys_for_keyread.init(0);
|
||||||
share->keys_in_use.init(keys);
|
share->keys_in_use.init(keys);
|
||||||
|
|
||||||
n_length=keys*sizeof(KEY)+key_parts*sizeof(KEY_PART_INFO);
|
/* Currently only InnoDB can use extended keys */
|
||||||
if (!(keyinfo = (KEY*) alloc_root(&share->mem_root,
|
share->set_use_ext_keys_flag(legacy_db_type == DB_TYPE_INNODB);
|
||||||
n_length + uint2korr(disk_buff+4))))
|
|
||||||
goto err; /* purecov: inspected */
|
|
||||||
bzero((char*) keyinfo,n_length);
|
|
||||||
share->key_info= keyinfo;
|
|
||||||
key_part= my_reinterpret_cast(KEY_PART_INFO*) (keyinfo+keys);
|
|
||||||
strpos=disk_buff+6;
|
|
||||||
|
|
||||||
if (!(rec_per_key= (ulong*) alloc_root(&share->mem_root,
|
len= (uint) uint2korr(disk_buff+4);
|
||||||
sizeof(ulong)*key_parts)))
|
if (!keys)
|
||||||
goto err;
|
{
|
||||||
|
if (!(keyinfo = (KEY*) alloc_root(&share->mem_root, len)))
|
||||||
|
goto err;
|
||||||
|
bzero((char*) keyinfo, len);
|
||||||
|
key_part= my_reinterpret_cast(KEY_PART_INFO*) (keyinfo+keys);
|
||||||
|
}
|
||||||
|
strpos= disk_buff+6;
|
||||||
|
|
||||||
|
/*
|
||||||
|
If share->use_ext_keys is set to TRUE we assume that any key
|
||||||
|
can be extended by the components of the primary key whose
|
||||||
|
definition is read first from the frm file.
|
||||||
|
For each key only those fields of the assumed primary key are
|
||||||
|
added that are not included in the proper key definition.
|
||||||
|
If after all it turns out that there is no primary key the
|
||||||
|
added components are removed from each key.
|
||||||
|
*/
|
||||||
|
|
||||||
for (i=0 ; i < keys ; i++, keyinfo++)
|
for (i=0 ; i < keys ; i++, keyinfo++)
|
||||||
{
|
{
|
||||||
|
@ -831,6 +848,32 @@ static int open_binary_frm(THD *thd, TABLE_SHARE *share, uchar *head,
|
||||||
strpos+=4;
|
strpos+=4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (i == 0)
|
||||||
|
{
|
||||||
|
ext_key_parts= key_parts +
|
||||||
|
(share->use_ext_keys ? first_keyinfo.key_parts*(keys-1) : 0);
|
||||||
|
|
||||||
|
n_length=keys*sizeof(KEY)+ext_key_parts*sizeof(KEY_PART_INFO);
|
||||||
|
if (!(keyinfo= (KEY*) alloc_root(&share->mem_root,
|
||||||
|
n_length + len)))
|
||||||
|
goto err; /* purecov: inspected */
|
||||||
|
bzero((char*) keyinfo,n_length);
|
||||||
|
share->key_info= keyinfo;
|
||||||
|
key_part= my_reinterpret_cast(KEY_PART_INFO*) (keyinfo+keys);
|
||||||
|
|
||||||
|
if (!(rec_per_key= (ulong*) alloc_root(&share->mem_root,
|
||||||
|
sizeof(ulong)*ext_key_parts)))
|
||||||
|
goto err;
|
||||||
|
first_key_part= key_part;
|
||||||
|
first_key_parts= first_keyinfo.key_parts;
|
||||||
|
keyinfo->flags= first_keyinfo.flags;
|
||||||
|
keyinfo->key_length= first_keyinfo.key_length;
|
||||||
|
keyinfo->key_parts= first_keyinfo.key_parts;
|
||||||
|
keyinfo->algorithm= first_keyinfo.algorithm;
|
||||||
|
if (new_frm_ver >= 3)
|
||||||
|
keyinfo->block_size= first_keyinfo.block_size;
|
||||||
|
}
|
||||||
|
|
||||||
keyinfo->key_part= key_part;
|
keyinfo->key_part= key_part;
|
||||||
keyinfo->rec_per_key= rec_per_key;
|
keyinfo->rec_per_key= rec_per_key;
|
||||||
for (j=keyinfo->key_parts ; j-- ; key_part++)
|
for (j=keyinfo->key_parts ; j-- ; key_part++)
|
||||||
|
@ -859,6 +902,31 @@ static int open_binary_frm(THD *thd, TABLE_SHARE *share, uchar *head,
|
||||||
}
|
}
|
||||||
key_part->store_length=key_part->length;
|
key_part->store_length=key_part->length;
|
||||||
}
|
}
|
||||||
|
keyinfo->ext_key_parts= keyinfo->key_parts;
|
||||||
|
if (share->use_ext_keys && i)
|
||||||
|
{
|
||||||
|
keyinfo->ext_key_flags= keyinfo->flags | HA_NOSAME;
|
||||||
|
keyinfo->ext_key_part_map= 0;
|
||||||
|
for (j= 0; j<first_key_parts && keyinfo->ext_key_parts<MAX_REF_PARTS; j++)
|
||||||
|
{
|
||||||
|
uint key_parts= keyinfo->key_parts;
|
||||||
|
KEY_PART_INFO* curr_key_part= keyinfo->key_part;
|
||||||
|
KEY_PART_INFO* curr_key_part_end= curr_key_part+key_parts;
|
||||||
|
for ( ; curr_key_part < curr_key_part_end; curr_key_part++)
|
||||||
|
{
|
||||||
|
if (curr_key_part->fieldnr == first_key_part[j].fieldnr)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (curr_key_part == curr_key_part_end)
|
||||||
|
{
|
||||||
|
*key_part++= first_key_part[j];
|
||||||
|
*rec_per_key++= 0;
|
||||||
|
keyinfo->ext_key_parts++;
|
||||||
|
keyinfo->ext_key_part_map|= 1 << j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
share->ext_key_parts+= keyinfo->ext_key_parts;
|
||||||
}
|
}
|
||||||
keynames=(char*) key_part;
|
keynames=(char*) key_part;
|
||||||
strpos+= (strmov(keynames, (char *) strpos) - keynames)+1;
|
strpos+= (strmov(keynames, (char *) strpos) - keynames)+1;
|
||||||
|
@ -1421,11 +1489,38 @@ static int open_binary_frm(THD *thd, TABLE_SHARE *share, uchar *head,
|
||||||
/* Fix key->name and key_part->field */
|
/* Fix key->name and key_part->field */
|
||||||
if (key_parts)
|
if (key_parts)
|
||||||
{
|
{
|
||||||
|
uint add_first_key_parts= 0;
|
||||||
uint primary_key=(uint) (find_type((char*) primary_key_name,
|
uint primary_key=(uint) (find_type((char*) primary_key_name,
|
||||||
&share->keynames, 3) - 1);
|
&share->keynames, 3) - 1);
|
||||||
longlong ha_option= handler_file->ha_table_flags();
|
longlong ha_option= handler_file->ha_table_flags();
|
||||||
keyinfo= share->key_info;
|
keyinfo= share->key_info;
|
||||||
key_part= keyinfo->key_part;
|
|
||||||
|
if (share->use_ext_keys)
|
||||||
|
{
|
||||||
|
if (primary_key >= MAX_KEY)
|
||||||
|
{
|
||||||
|
add_first_key_parts= 0;
|
||||||
|
share->set_use_ext_keys_flag(FALSE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
add_first_key_parts= first_key_parts;
|
||||||
|
/*
|
||||||
|
Do not add components of the primary key starting from
|
||||||
|
the major component defined over the beginning of a field.
|
||||||
|
*/
|
||||||
|
for (i= 0; i < first_key_parts; i++)
|
||||||
|
{
|
||||||
|
uint fieldnr= keyinfo[0].key_part[i].fieldnr;
|
||||||
|
if (share->field[fieldnr-1]->key_length() !=
|
||||||
|
keyinfo[0].key_part[i].length)
|
||||||
|
{
|
||||||
|
add_first_key_parts= i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (uint key=0 ; key < share->keys ; key++,keyinfo++)
|
for (uint key=0 ; key < share->keys ; key++,keyinfo++)
|
||||||
{
|
{
|
||||||
|
@ -1444,6 +1539,51 @@ static int open_binary_frm(THD *thd, TABLE_SHARE *share, uchar *head,
|
||||||
keyinfo->name_length+1);
|
keyinfo->name_length+1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ext_key_parts > share->key_parts && key)
|
||||||
|
{
|
||||||
|
KEY_PART_INFO *new_key_part= (keyinfo-1)->key_part+
|
||||||
|
(keyinfo-1)->ext_key_parts;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Do not extend the key that contains a component
|
||||||
|
defined over the beginning of a field.
|
||||||
|
*/
|
||||||
|
for (i= 0; i < keyinfo->key_parts; i++)
|
||||||
|
{
|
||||||
|
uint fieldnr= keyinfo->key_part[i].fieldnr;
|
||||||
|
if (share->field[fieldnr-1]->key_length() !=
|
||||||
|
keyinfo->key_part[i].length)
|
||||||
|
{
|
||||||
|
add_first_key_parts= 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (add_first_key_parts < keyinfo->ext_key_parts-keyinfo->key_parts)
|
||||||
|
{
|
||||||
|
share->ext_key_parts-= keyinfo->ext_key_parts;
|
||||||
|
key_part_map ext_key_part_map= keyinfo->ext_key_part_map;
|
||||||
|
keyinfo->ext_key_parts= keyinfo->key_parts;
|
||||||
|
keyinfo->ext_key_flags= keyinfo->flags;
|
||||||
|
keyinfo->ext_key_part_map= 0;
|
||||||
|
for (i= 0; i < add_first_key_parts; i++)
|
||||||
|
{
|
||||||
|
if (ext_key_part_map & 1<<i)
|
||||||
|
{
|
||||||
|
keyinfo->ext_key_part_map|= 1<<i;
|
||||||
|
keyinfo->ext_key_parts++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
share->ext_key_parts+= keyinfo->ext_key_parts;
|
||||||
|
}
|
||||||
|
if (new_key_part != keyinfo->key_part)
|
||||||
|
{
|
||||||
|
memmove(new_key_part, keyinfo->key_part,
|
||||||
|
sizeof(KEY_PART_INFO) * keyinfo->ext_key_parts);
|
||||||
|
keyinfo->key_part= new_key_part;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Fix fulltext keys for old .frm files */
|
/* Fix fulltext keys for old .frm files */
|
||||||
if (share->key_info[key].flags & HA_FULLTEXT)
|
if (share->key_info[key].flags & HA_FULLTEXT)
|
||||||
share->key_info[key].algorithm= HA_KEY_ALG_FULLTEXT;
|
share->key_info[key].algorithm= HA_KEY_ALG_FULLTEXT;
|
||||||
|
@ -1455,6 +1595,7 @@ static int open_binary_frm(THD *thd, TABLE_SHARE *share, uchar *head,
|
||||||
declare this as a primary key.
|
declare this as a primary key.
|
||||||
*/
|
*/
|
||||||
primary_key=key;
|
primary_key=key;
|
||||||
|
key_part= keyinfo->key_part;
|
||||||
for (i=0 ; i < keyinfo->key_parts ;i++)
|
for (i=0 ; i < keyinfo->key_parts ;i++)
|
||||||
{
|
{
|
||||||
uint fieldnr= key_part[i].fieldnr;
|
uint fieldnr= key_part[i].fieldnr;
|
||||||
|
@ -1469,7 +1610,10 @@ static int open_binary_frm(THD *thd, TABLE_SHARE *share, uchar *head,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i=0 ; i < keyinfo->key_parts ; key_part++,i++)
|
key_part= keyinfo->key_part;
|
||||||
|
uint key_parts= share->use_ext_keys ? keyinfo->ext_key_parts :
|
||||||
|
keyinfo->key_parts;
|
||||||
|
for (i=0; i < key_parts; key_part++, i++)
|
||||||
{
|
{
|
||||||
Field *field;
|
Field *field;
|
||||||
if (new_field_pack_flag <= 1)
|
if (new_field_pack_flag <= 1)
|
||||||
|
@ -1521,7 +1665,8 @@ static int open_binary_frm(THD *thd, TABLE_SHARE *share, uchar *head,
|
||||||
{
|
{
|
||||||
share->keys_for_keyread.set_bit(key);
|
share->keys_for_keyread.set_bit(key);
|
||||||
field->part_of_key.set_bit(key);
|
field->part_of_key.set_bit(key);
|
||||||
field->part_of_key_not_clustered.set_bit(key);
|
if (i < keyinfo->key_parts)
|
||||||
|
field->part_of_key_not_clustered.set_bit(key);
|
||||||
}
|
}
|
||||||
if (handler_file->index_flags(key, i, 1) & HA_READ_ORDER)
|
if (handler_file->index_flags(key, i, 1) & HA_READ_ORDER)
|
||||||
field->part_of_sortkey.set_bit(key);
|
field->part_of_sortkey.set_bit(key);
|
||||||
|
@ -2196,7 +2341,7 @@ int open_table_from_share(THD *thd, TABLE_SHARE *share, const char *alias,
|
||||||
KEY *key_info, *key_info_end;
|
KEY *key_info, *key_info_end;
|
||||||
KEY_PART_INFO *key_part;
|
KEY_PART_INFO *key_part;
|
||||||
uint n_length;
|
uint n_length;
|
||||||
n_length= share->keys*sizeof(KEY) + share->key_parts*sizeof(KEY_PART_INFO);
|
n_length= share->keys*sizeof(KEY) + share->ext_key_parts*sizeof(KEY_PART_INFO);
|
||||||
if (!(key_info= (KEY*) alloc_root(&outparam->mem_root, n_length)))
|
if (!(key_info= (KEY*) alloc_root(&outparam->mem_root, n_length)))
|
||||||
goto err;
|
goto err;
|
||||||
outparam->key_info= key_info;
|
outparam->key_info= key_info;
|
||||||
|
@ -2204,7 +2349,7 @@ int open_table_from_share(THD *thd, TABLE_SHARE *share, const char *alias,
|
||||||
|
|
||||||
memcpy(key_info, share->key_info, sizeof(*key_info)*share->keys);
|
memcpy(key_info, share->key_info, sizeof(*key_info)*share->keys);
|
||||||
memcpy(key_part, share->key_info[0].key_part, (sizeof(*key_part) *
|
memcpy(key_part, share->key_info[0].key_part, (sizeof(*key_part) *
|
||||||
share->key_parts));
|
share->ext_key_parts));
|
||||||
|
|
||||||
for (key_info_end= key_info + share->keys ;
|
for (key_info_end= key_info + share->keys ;
|
||||||
key_info < key_info_end ;
|
key_info < key_info_end ;
|
||||||
|
@ -2215,9 +2360,9 @@ int open_table_from_share(THD *thd, TABLE_SHARE *share, const char *alias,
|
||||||
key_info->table= outparam;
|
key_info->table= outparam;
|
||||||
key_info->key_part= key_part;
|
key_info->key_part= key_part;
|
||||||
|
|
||||||
for (key_part_end= key_part+ key_info->key_parts ;
|
key_part_end= key_part + (share->use_ext_keys ? key_info->ext_key_parts :
|
||||||
key_part < key_part_end ;
|
key_info->key_parts) ;
|
||||||
key_part++)
|
for ( ; key_part < key_part_end; key_part++)
|
||||||
{
|
{
|
||||||
Field *field= key_part->field= outparam->field[key_part->fieldnr-1];
|
Field *field= key_part->field= outparam->field[key_part->fieldnr-1];
|
||||||
|
|
||||||
|
@ -2233,6 +2378,8 @@ int open_table_from_share(THD *thd, TABLE_SHARE *share, const char *alias,
|
||||||
field->field_length= key_part->length;
|
field->field_length= key_part->length;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!share->use_ext_keys)
|
||||||
|
key_part+= key_info->ext_key_parts-key_info->key_parts;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3138,7 +3285,7 @@ uint calculate_key_len(TABLE *table, uint key, const uchar *buf,
|
||||||
|
|
||||||
KEY *key_info= table->s->key_info+key;
|
KEY *key_info= table->s->key_info+key;
|
||||||
KEY_PART_INFO *key_part= key_info->key_part;
|
KEY_PART_INFO *key_part= key_info->key_part;
|
||||||
KEY_PART_INFO *end_key_part= key_part + key_info->key_parts;
|
KEY_PART_INFO *end_key_part= key_part + table->actual_n_key_parts(key_info);
|
||||||
uint length= 0;
|
uint length= 0;
|
||||||
|
|
||||||
while (key_part < end_key_part && keypart_map)
|
while (key_part < end_key_part && keypart_map)
|
||||||
|
@ -5414,6 +5561,47 @@ bool st_table::is_filled_at_execution()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief
|
||||||
|
Get actual number of key components
|
||||||
|
|
||||||
|
@param keyinfo
|
||||||
|
|
||||||
|
@details
|
||||||
|
The function calculates actual number of key components, possibly including
|
||||||
|
components of extended keys, taken into consideration by the optimizer for the
|
||||||
|
key described by the parameter keyinfo.
|
||||||
|
|
||||||
|
@return number of considered key components
|
||||||
|
*/
|
||||||
|
|
||||||
|
inline uint st_table::actual_n_key_parts(KEY *keyinfo)
|
||||||
|
{
|
||||||
|
return optimizer_flag(in_use, OPTIMIZER_SWITCH_EXTENDED_KEYS) ?
|
||||||
|
keyinfo->ext_key_parts : keyinfo->key_parts;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief
|
||||||
|
Get actual key flags for a table key
|
||||||
|
|
||||||
|
@param keyinfo
|
||||||
|
|
||||||
|
@details
|
||||||
|
The function finds out actual key flags taken into consideration by the
|
||||||
|
optimizer for the key described by the parameter keyinfo.
|
||||||
|
|
||||||
|
@return actual key flags
|
||||||
|
*/
|
||||||
|
|
||||||
|
ulong st_table::actual_key_flags(KEY *keyinfo)
|
||||||
|
{
|
||||||
|
return optimizer_flag(in_use, OPTIMIZER_SWITCH_EXTENDED_KEYS) ?
|
||||||
|
keyinfo->ext_key_flags : keyinfo->flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Cleanup this table for re-execution.
|
Cleanup this table for re-execution.
|
||||||
|
|
||||||
|
@ -6007,6 +6195,14 @@ bool TABLE_LIST::change_refs_to_fields()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint TABLE_SHARE::actual_n_key_parts(THD *thd)
|
||||||
|
{
|
||||||
|
return use_ext_keys &&
|
||||||
|
optimizer_flag(thd, OPTIMIZER_SWITCH_EXTENDED_KEYS) ?
|
||||||
|
ext_key_parts : key_parts;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
** Instansiate templates
|
** Instansiate templates
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
11
sql/table.h
11
sql/table.h
|
@ -418,6 +418,7 @@ typedef struct st_table_share
|
||||||
uint stored_fields;
|
uint stored_fields;
|
||||||
uint rec_buff_length; /* Size of table->record[] buffer */
|
uint rec_buff_length; /* Size of table->record[] buffer */
|
||||||
uint keys, key_parts;
|
uint keys, key_parts;
|
||||||
|
uint ext_key_parts; /* Total number of key parts in extended keys */
|
||||||
uint max_key_length, max_unique_length, total_key_length;
|
uint max_key_length, max_unique_length, total_key_length;
|
||||||
uint uniques; /* Number of UNIQUE index */
|
uint uniques; /* Number of UNIQUE index */
|
||||||
uint null_fields; /* number of null fields */
|
uint null_fields; /* number of null fields */
|
||||||
|
@ -438,6 +439,7 @@ typedef struct st_table_share
|
||||||
uint column_bitmap_size;
|
uint column_bitmap_size;
|
||||||
uchar frm_version;
|
uchar frm_version;
|
||||||
uint vfields; /* Number of computed (virtual) fields */
|
uint vfields; /* Number of computed (virtual) fields */
|
||||||
|
bool use_ext_keys; /* Extended keys can be used */
|
||||||
bool null_field_first;
|
bool null_field_first;
|
||||||
bool system; /* Set if system table (one record) */
|
bool system; /* Set if system table (one record) */
|
||||||
bool crypted; /* If .frm file is crypted */
|
bool crypted; /* If .frm file is crypted */
|
||||||
|
@ -652,6 +654,13 @@ typedef struct st_table_share
|
||||||
return (tmp_table == SYSTEM_TMP_TABLE || is_view) ? 0 : table_map_id;
|
return (tmp_table == SYSTEM_TMP_TABLE || is_view) ? 0 : table_map_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void set_use_ext_keys_flag(bool fl)
|
||||||
|
{
|
||||||
|
use_ext_keys= fl;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint actual_n_key_parts(THD *thd);
|
||||||
|
|
||||||
} TABLE_SHARE;
|
} TABLE_SHARE;
|
||||||
|
|
||||||
|
|
||||||
|
@ -991,6 +1000,8 @@ struct st_table {
|
||||||
}
|
}
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
uint actual_n_key_parts(KEY *keyinfo);
|
||||||
|
ulong actual_key_flags(KEY *keyinfo);
|
||||||
};
|
};
|
||||||
|
|
||||||
enum enum_schema_table_state
|
enum enum_schema_table_state
|
||||||
|
|
|
@ -7849,6 +7849,7 @@ ha_innobase::records_in_range(
|
||||||
ib_int64_t n_rows;
|
ib_int64_t n_rows;
|
||||||
ulint mode1;
|
ulint mode1;
|
||||||
ulint mode2;
|
ulint mode2;
|
||||||
|
uint key_parts;
|
||||||
mem_heap_t* heap;
|
mem_heap_t* heap;
|
||||||
|
|
||||||
DBUG_ENTER("records_in_range");
|
DBUG_ENTER("records_in_range");
|
||||||
|
@ -7880,14 +7881,19 @@ ha_innobase::records_in_range(
|
||||||
goto func_exit;
|
goto func_exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
heap = mem_heap_create(2 * (key->key_parts * sizeof(dfield_t)
|
key_parts= key->key_parts;
|
||||||
|
if ((min_key && min_key->keypart_map>=(key_part_map) (1<<key_parts)) ||
|
||||||
|
(max_key && max_key->keypart_map>=(key_part_map) (1<<key_parts)))
|
||||||
|
key_parts= key->ext_key_parts;
|
||||||
|
|
||||||
|
heap = mem_heap_create(2 * (key_parts * sizeof(dfield_t)
|
||||||
+ sizeof(dtuple_t)));
|
+ sizeof(dtuple_t)));
|
||||||
|
|
||||||
range_start = dtuple_create(heap, key->key_parts);
|
range_start = dtuple_create(heap, key_parts);
|
||||||
dict_index_copy_types(range_start, index, key->key_parts);
|
dict_index_copy_types(range_start, index, key_parts);
|
||||||
|
|
||||||
range_end = dtuple_create(heap, key->key_parts);
|
range_end = dtuple_create(heap, key_parts);
|
||||||
dict_index_copy_types(range_end, index, key->key_parts);
|
dict_index_copy_types(range_end, index, key_parts);
|
||||||
|
|
||||||
row_sel_convert_mysql_key_to_innobase(
|
row_sel_convert_mysql_key_to_innobase(
|
||||||
range_start, (byte*) key_val_buff,
|
range_start, (byte*) key_val_buff,
|
||||||
|
@ -8472,6 +8478,41 @@ ha_innobase::info_low(
|
||||||
rec_per_key >= ~(ulong) 0 ? ~(ulong) 0 :
|
rec_per_key >= ~(ulong) 0 ? ~(ulong) 0 :
|
||||||
(ulong) rec_per_key;
|
(ulong) rec_per_key;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
KEY *key_info= table->key_info+i;
|
||||||
|
key_part_map ext_key_part_map= key_info->ext_key_part_map;
|
||||||
|
|
||||||
|
if (key_info->key_parts != key_info->ext_key_parts) {
|
||||||
|
|
||||||
|
|
||||||
|
KEY *pk_key_info= key_info+
|
||||||
|
table->s->primary_key;
|
||||||
|
uint k= key_info->key_parts;
|
||||||
|
|
||||||
|
for (j = 0; j < pk_key_info->key_parts; j++) {
|
||||||
|
|
||||||
|
if (ext_key_part_map & 1<<j) {
|
||||||
|
|
||||||
|
index = innobase_get_index(
|
||||||
|
table->s->primary_key);
|
||||||
|
rec_per_key =
|
||||||
|
innodb_rec_per_key(index,
|
||||||
|
j, stats.records);
|
||||||
|
|
||||||
|
|
||||||
|
if (rec_per_key == 0) {
|
||||||
|
rec_per_key = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
key_info->rec_per_key[k++]=
|
||||||
|
rec_per_key >= ~(ulong) 0 ?
|
||||||
|
~(ulong) 0 :
|
||||||
|
(ulong) rec_per_key;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dict_table_stats_unlock(ib_table, RW_S_LATCH);
|
dict_table_stats_unlock(ib_table, RW_S_LATCH);
|
||||||
|
|
Loading…
Add table
Reference in a new issue