mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 18:20:07 +01:00
8b7c0d69d2
In essence this means that we expect the user query to have at least one matching row in the end. This change will not affect the estimated rows for the plan, but will ensure that the cost for adding a table is not neglected because of record count being too low. The reasons for this is that if we have table combination that together has a very high selectivity then join record_count could become very low (close to 0) This would cause costs for all future tables to be so small that they are irrelevant for the rest of the plan. This has been shown to be the case in some performance benchmarks and in a few mtr tests. There is also still a problem in selectivity calculations as joining two tables in different order causes a different estimation of total rows. This can be seen in selectivity_innodb.test, test 'Q20' where joining nation,supplier is expecting 1.111 rows_out while joining supplier,nation is expecting 0.04 rows_out. The reason for 0.04 is that the optimizer estimates 'supplier' to have 10 matching rows, and joining with nation (eq_ref) has 1 row. However selectivity of n_name = 'UNITED STATES' makes the optimizer things that there will be only 0.04 matching rows. This patch avoids this "too low row count" to affect cost caclulations.
294 lines
12 KiB
Text
294 lines
12 KiB
Text
--- main/innodb_ext_key.result
|
|
+++ main/innodb_ext_key,off.reject
|
|
@@ -9,7 +9,7 @@
|
|
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
|
|
+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_orderkey=130 and l_shipdate='1992-07-01';
|
|
count(*)
|
|
@@ -19,7 +19,7 @@
|
|
Handler_read_first 0
|
|
Handler_read_key 1
|
|
Handler_read_last 0
|
|
-Handler_read_next 1
|
|
+Handler_read_next 6
|
|
Handler_read_prev 0
|
|
Handler_read_retry 0
|
|
Handler_read_rnd 0
|
|
@@ -50,7 +50,7 @@
|
|
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
|
|
+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;
|
|
@@ -61,7 +61,7 @@
|
|
Handler_read_first 0
|
|
Handler_read_key 1
|
|
Handler_read_last 0
|
|
-Handler_read_next 1
|
|
+Handler_read_next 6
|
|
Handler_read_prev 0
|
|
Handler_read_retry 0
|
|
Handler_read_rnd 0
|
|
@@ -71,7 +71,7 @@
|
|
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
|
|
+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;
|
|
@@ -84,7 +84,7 @@
|
|
Handler_read_first 0
|
|
Handler_read_key 1
|
|
Handler_read_last 0
|
|
-Handler_read_next 3
|
|
+Handler_read_next 6
|
|
Handler_read_prev 0
|
|
Handler_read_retry 0
|
|
Handler_read_rnd 0
|
|
@@ -93,7 +93,7 @@
|
|
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
|
|
+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)
|
|
@@ -103,7 +103,7 @@
|
|
Handler_read_first 0
|
|
Handler_read_key 1
|
|
Handler_read_last 0
|
|
-Handler_read_next 0
|
|
+Handler_read_next 6
|
|
Handler_read_prev 0
|
|
Handler_read_retry 0
|
|
Handler_read_rnd 0
|
|
@@ -113,7 +113,7 @@
|
|
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
|
|
+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;
|
|
@@ -124,7 +124,7 @@
|
|
Handler_read_first 0
|
|
Handler_read_key 1
|
|
Handler_read_last 0
|
|
-Handler_read_next 0
|
|
+Handler_read_next 6
|
|
Handler_read_prev 0
|
|
Handler_read_retry 0
|
|
Handler_read_rnd 0
|
|
@@ -134,7 +134,7 @@
|
|
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
|
|
+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 max(l_linenumber) from lineitem
|
|
where l_shipdate='1992-07-01' and l_orderkey=130;
|
|
@@ -145,7 +145,7 @@
|
|
Handler_read_first 0
|
|
Handler_read_key 1
|
|
Handler_read_last 0
|
|
-Handler_read_next 0
|
|
+Handler_read_next 6
|
|
Handler_read_prev 0
|
|
Handler_read_retry 0
|
|
Handler_read_rnd 0
|
|
@@ -157,7 +157,7 @@
|
|
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 union(i_l_shipdate,i_l_receiptdate); Using where
|
|
+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)
|
|
@@ -171,10 +171,10 @@
|
|
Handler_read_first 0
|
|
Handler_read_key 2
|
|
Handler_read_last 0
|
|
-Handler_read_next 2
|
|
+Handler_read_next 9
|
|
Handler_read_prev 0
|
|
Handler_read_retry 0
|
|
-Handler_read_rnd 2
|
|
+Handler_read_rnd 9
|
|
Handler_read_rnd_deleted 0
|
|
Handler_read_rnd_next 0
|
|
explain
|
|
@@ -183,7 +183,7 @@
|
|
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 # NULL 3 Using sort_union(i_l_shipdate,i_l_receiptdate); Using where
|
|
+1 SIMPLE lineitem index_merge i_l_shipdate,i_l_receiptdate i_l_shipdate,i_l_receiptdate # 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)
|
|
@@ -198,10 +198,10 @@
|
|
Handler_read_first 0
|
|
Handler_read_key 2
|
|
Handler_read_last 0
|
|
-Handler_read_next 3
|
|
+Handler_read_next 9
|
|
Handler_read_prev 0
|
|
Handler_read_retry 0
|
|
-Handler_read_rnd 3
|
|
+Handler_read_rnd 9
|
|
Handler_read_rnd_deleted 0
|
|
Handler_read_rnd_next 0
|
|
explain
|
|
@@ -209,7 +209,7 @@
|
|
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 # NULL # Using
|
|
+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 # NULL # Using
|
|
flush status;
|
|
select l_orderkey, l_linenumber from lineitem
|
|
where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000
|
|
@@ -220,12 +220,12 @@
|
|
5959 3
|
|
show status like 'handler_read_next';
|
|
Variable_name Value
|
|
-Handler_read_next 3
|
|
+Handler_read_next 9
|
|
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
|
|
+1 SIMPLE lineitem range i_l_suppkey_partkey,i_l_partkey i_l_suppkey_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;
|
|
@@ -243,9 +243,9 @@
|
|
show status like 'handler_read%';
|
|
Variable_name Value
|
|
Handler_read_first 0
|
|
-Handler_read_key 21
|
|
-Handler_read_last 1
|
|
-Handler_read_next 0
|
|
+Handler_read_key 1
|
|
+Handler_read_last 0
|
|
+Handler_read_next 294
|
|
Handler_read_prev 0
|
|
Handler_read_retry 0
|
|
Handler_read_rnd 0
|
|
@@ -255,7 +255,7 @@
|
|
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
|
|
+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;
|
|
@@ -265,9 +265,9 @@
|
|
show status like 'handler_read%';
|
|
Variable_name Value
|
|
Handler_read_first 0
|
|
-Handler_read_key 6
|
|
-Handler_read_last 1
|
|
-Handler_read_next 0
|
|
+Handler_read_key 2
|
|
+Handler_read_last 0
|
|
+Handler_read_next 1230
|
|
Handler_read_prev 0
|
|
Handler_read_retry 0
|
|
Handler_read_rnd 0
|
|
@@ -283,7 +283,7 @@
|
|
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
|
|
+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),
|
|
@@ -297,7 +297,7 @@
|
|
Handler_read_first 0
|
|
Handler_read_key 3
|
|
Handler_read_last 0
|
|
-Handler_read_next 3
|
|
+Handler_read_next 26
|
|
Handler_read_prev 0
|
|
Handler_read_retry 0
|
|
Handler_read_rnd 0
|
|
@@ -314,8 +314,8 @@
|
|
select straight_join * from t0, part ignore index (primary)
|
|
where p_partkey=t0.a and p_size=1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
-1 SIMPLE t0 ALL NULL NULL NULL NULL 5 Using where
|
|
-1 SIMPLE part eq_ref i_p_size i_p_size 9 const,dbt3_s001.t0.a 1
|
|
+1 SIMPLE t0 ALL NULL NULL NULL NULL 5
|
|
+1 SIMPLE part ref i_p_size i_p_size 5 const 5 Using index condition
|
|
select straight_join * from t0, part ignore index (primary)
|
|
where p_partkey=t0.a and p_size=1;
|
|
a p_partkey p_name p_mfgr p_brand p_type p_size p_container p_retailprice p_comment
|
|
@@ -495,7 +495,7 @@
|
|
select * from t1, t3 where t3.col1=t1.a and t3.col2=t1.a and t3.pk1=t1.a;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL # Using where
|
|
-1 SIMPLE t3 ref PRIMARY,col1 col1 12 test.t1.a,test.t1.a,test.t1.a # Using index
|
|
+1 SIMPLE t3 ref PRIMARY,col1 col1 8 test.t1.a,test.t1.a # Using where; Using index
|
|
drop table t1,t2,t3;
|
|
#
|
|
# Bug mdev-4340: performance regression with extended_keys=on
|
|
@@ -726,13 +726,13 @@
|
|
select * from t1 force index(index_date_updated)
|
|
where index_date_updated= 10 and index_id < 800;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
-1 SIMPLE t1 range index_date_updated index_date_updated 13 NULL # Using index condition
|
|
+1 SIMPLE t1 ref index_date_updated index_date_updated 5 const # Using index condition
|
|
# This used to work from the start:
|
|
explain
|
|
select * from t2 force index(index_date_updated)
|
|
where index_date_updated= 10 and index_id < 800;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
-1 SIMPLE t2 range index_date_updated index_date_updated 13 NULL # Using index condition
|
|
+1 SIMPLE t2 ref index_date_updated index_date_updated 5 const # Using index condition
|
|
drop table t0,t1,t2;
|
|
#
|
|
# MDEV-11196: Error:Run-Time Check Failure #2 - Stack around the variable 'key_buff'
|
|
@@ -770,11 +770,12 @@
|
|
{
|
|
"table": {
|
|
"table_name": "t1",
|
|
- "access_type": "range",
|
|
+ "access_type": "ref",
|
|
"possible_keys": ["f2"],
|
|
"key": "f2",
|
|
- "key_length": "3070",
|
|
- "used_key_parts": ["f2", "pk1"],
|
|
+ "key_length": "3066",
|
|
+ "used_key_parts": ["f2"],
|
|
+ "ref": ["const"],
|
|
"loops": 1,
|
|
"rows": 1,
|
|
"cost": "COST_REPLACED",
|
|
@@ -810,8 +811,8 @@
|
|
"access_type": "range",
|
|
"possible_keys": ["k1"],
|
|
"key": "k1",
|
|
- "key_length": "3011",
|
|
- "used_key_parts": ["pk1", "f2", "pk2"],
|
|
+ "key_length": "3007",
|
|
+ "used_key_parts": ["pk1", "f2"],
|
|
"loops": 1,
|
|
"rows": 1,
|
|
"cost": "COST_REPLACED",
|