Skip to content

Commit b729896

Browse files
committed
MDEV-28073 Query performance degradation in newer MariaDB versions when using many tables
The issue was that best_extension_by_limited_search() had to go through too many plans with the same cost as there where many EQ_REF tables. Fixed by shortcutting EQ_REF (AND REF) when the result only contains one row. This got the optimization time down from hours to sub seconds. The only known downside with this patch is that in some cases a table with ref and 1 record may be used before on EQ_REF table. The faster optimzation phase should compensate for this.
1 parent f7dd879 commit b729896

9 files changed

+164
-136
lines changed

mysql-test/main/opt_trace.result

Lines changed: 38 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,7 @@ select * from v1 {
145145
}
146146
},
147147
"rows_for_plan": 1,
148-
"cost_for_plan": 2.404394531,
149-
"estimated_join_cardinality": 1
148+
"cost_for_plan": 2.404394531
150149
}
151150
]
152151
},
@@ -296,8 +295,7 @@ select * from (select * from t1 where t1.a=1)q {
296295
}
297296
},
298297
"rows_for_plan": 1,
299-
"cost_for_plan": 2.404394531,
300-
"estimated_join_cardinality": 1
298+
"cost_for_plan": 2.404394531
301299
}
302300
]
303301
},
@@ -454,8 +452,7 @@ select * from v2 {
454452
},
455453
"rows_for_plan": 1,
456454
"cost_for_plan": 2.404394531,
457-
"cost_for_sorting": 1,
458-
"estimated_join_cardinality": 1
455+
"cost_for_sorting": 1
459456
}
460457
]
461458
},
@@ -525,8 +522,7 @@ select * from v2 {
525522
}
526523
},
527524
"rows_for_plan": 2,
528-
"cost_for_plan": 2.4,
529-
"estimated_join_cardinality": 2
525+
"cost_for_plan": 2.4
530526
}
531527
]
532528
},
@@ -662,8 +658,7 @@ explain select * from v2 {
662658
}
663659
},
664660
"rows_for_plan": 10,
665-
"cost_for_plan": 4.021972656,
666-
"estimated_join_cardinality": 10
661+
"cost_for_plan": 4.021972656
667662
}
668663
]
669664
},
@@ -780,8 +775,7 @@ explain select * from v1 {
780775
},
781776
"rows_for_plan": 10,
782777
"cost_for_plan": 4.021972656,
783-
"cost_for_sorting": 10,
784-
"estimated_join_cardinality": 10
778+
"cost_for_sorting": 10
785779
}
786780
]
787781
},
@@ -845,8 +839,7 @@ explain select * from v1 {
845839
}
846840
},
847841
"rows_for_plan": 10,
848-
"cost_for_plan": 12,
849-
"estimated_join_cardinality": 10
842+
"cost_for_plan": 12
850843
}
851844
]
852845
},
@@ -1047,7 +1040,7 @@ explain select * from t1,t2 where t1.a=t2.b+2 and t2.a= t1.b {
10471040
},
10481041
"rows_for_plan": 100,
10491042
"cost_for_plan": 242.3759623,
1050-
"estimated_join_cardinality": 100
1043+
"pruned_by_hanging_leaf": true
10511044
}
10521045
]
10531046
},
@@ -1278,8 +1271,7 @@ EXPLAIN SELECT DISTINCT a FROM t1 {
12781271
}
12791272
},
12801273
"rows_for_plan": 5,
1281-
"cost_for_plan": 7.25,
1282-
"estimated_join_cardinality": 5
1274+
"cost_for_plan": 7.25
12831275
}
12841276
]
12851277
},
@@ -1470,8 +1462,7 @@ EXPLAIN SELECT MIN(d) FROM t1 where b=2 and c=3 group by a {
14701462
},
14711463
"rows_for_plan": 8,
14721464
"cost_for_plan": 3.8,
1473-
"cost_for_sorting": 8,
1474-
"estimated_join_cardinality": 8
1465+
"cost_for_sorting": 8
14751466
}
14761467
]
14771468
},
@@ -1669,8 +1660,7 @@ EXPLAIN SELECT id,MIN(a),MAX(a) FROM t1 WHERE a>=20010104e0 GROUP BY id {
16691660
},
16701661
"rows_for_plan": 9,
16711662
"cost_for_plan": 4.15,
1672-
"cost_for_sorting": 9,
1673-
"estimated_join_cardinality": 9
1663+
"cost_for_sorting": 9
16741664
}
16751665
]
16761666
},
@@ -1857,8 +1847,7 @@ EXPLAIN SELECT * FROM t1 WHERE a = 20010104e0 GROUP BY id {
18571847
},
18581848
"rows_for_plan": 9,
18591849
"cost_for_plan": 4.15,
1860-
"cost_for_sorting": 9,
1861-
"estimated_join_cardinality": 9
1850+
"cost_for_sorting": 9
18621851
}
18631852
]
18641853
},
@@ -2140,8 +2129,7 @@ explain select * from t1 where a=1 and b=2 order by c limit 1 {
21402129
}
21412130
},
21422131
"rows_for_plan": 21,
2143-
"cost_for_plan": 25.34242739,
2144-
"estimated_join_cardinality": 21
2132+
"cost_for_plan": 25.34242739
21452133
}
21462134
]
21472135
},
@@ -2392,8 +2380,7 @@ select t1.a from t1 left join t2 on t1.a=t2.a {
23922380
}
23932381
},
23942382
"rows_for_plan": 4,
2395-
"cost_for_plan": 2.806835937,
2396-
"estimated_join_cardinality": 4
2383+
"cost_for_plan": 2.806835937
23972384
}
23982385
]
23992386
},
@@ -2561,7 +2548,7 @@ explain select * from t1 left join t2 on t2.a=t1.a {
25612548
},
25622549
"rows_for_plan": 4,
25632550
"cost_for_plan": 7.606835937,
2564-
"estimated_join_cardinality": 4
2551+
"pruned_by_hanging_leaf": true
25652552
}
25662553
]
25672554
}
@@ -2740,8 +2727,7 @@ explain select t1.a from t1 left join (t2 join t3 on t2.b=t3.b) on t2.a=t1.a and
27402727
}
27412728
},
27422729
"rows_for_plan": 4,
2743-
"cost_for_plan": 2.806835937,
2744-
"estimated_join_cardinality": 4
2730+
"cost_for_plan": 2.806835937
27452731
}
27462732
]
27472733
},
@@ -2948,8 +2934,7 @@ explain extended select * from t1 where a in (select pk from t10) {
29482934
}
29492935
},
29502936
"rows_for_plan": 10,
2951-
"cost_for_plan": 4.021972656,
2952-
"estimated_join_cardinality": 10
2937+
"cost_for_plan": 4.021972656
29532938
}
29542939
]
29552940
}
@@ -3021,8 +3006,7 @@ explain extended select * from t1 where a in (select pk from t10) {
30213006
{
30223007
"chosen_strategy": "SJ-Materialization"
30233008
}
3024-
],
3025-
"estimated_join_cardinality": 3
3009+
]
30263010
}
30273011
]
30283012
},
@@ -3427,7 +3411,7 @@ explain select * from t1 where pk = 2 and a=5 and b=1 {
34273411
},
34283412
"rows_for_plan": 1,
34293413
"cost_for_plan": 0.326073957,
3430-
"estimated_join_cardinality": 1
3414+
"pruned_by_hanging_leaf": true
34313415
}
34323416
]
34333417
},
@@ -3555,8 +3539,7 @@ select f1(a) from t1 {
35553539
}
35563540
},
35573541
"rows_for_plan": 4,
3558-
"cost_for_plan": 2.806835937,
3559-
"estimated_join_cardinality": 4
3542+
"cost_for_plan": 2.806835937
35603543
}
35613544
]
35623545
},
@@ -3652,8 +3635,7 @@ select f2(a) from t1 {
36523635
}
36533636
},
36543637
"rows_for_plan": 4,
3655-
"cost_for_plan": 2.806835937,
3656-
"estimated_join_cardinality": 4
3638+
"cost_for_plan": 2.806835937
36573639
}
36583640
]
36593641
},
@@ -3699,7 +3681,7 @@ a
36993681
2
37003682
select length(trace) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
37013683
length(trace)
3702-
2141
3684+
2092
37033685
set optimizer_trace_max_mem_size=100;
37043686
select * from t1;
37053687
a
@@ -3713,15 +3695,15 @@ select * from t1 {
37133695
"join_preparation": {
37143696
"select_id": 1,
37153697
"steps": [
3716-
2041 0
3698+
1992 0
37173699
set optimizer_trace_max_mem_size=0;
37183700
select * from t1;
37193701
a
37203702
1
37213703
2
37223704
select * from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
37233705
QUERY TRACE MISSING_BYTES_BEYOND_MAX_MEM_SIZE INSUFFICIENT_PRIVILEGES
3724-
select * from t1 2141 0
3706+
select * from t1 2092 0
37253707
drop table t1;
37263708
set optimizer_trace='enabled=off';
37273709
set @@optimizer_trace_max_mem_size= @save_optimizer_trace_max_mem_size;
@@ -4064,7 +4046,7 @@ explain delete t0,t1 from t0, t1 where t0.a=t1.a and t1.a<3 {
40644046
},
40654047
"rows_for_plan": 3,
40664048
"cost_for_plan": 4.948514767,
4067-
"estimated_join_cardinality": 3
4049+
"pruned_by_hanging_leaf": true
40684050
}
40694051
]
40704052
},
@@ -4263,8 +4245,7 @@ explain select * from (select rand() from t1)q {
42634245
}
42644246
},
42654247
"rows_for_plan": 3,
4266-
"cost_for_plan": 2.605126953,
4267-
"estimated_join_cardinality": 3
4248+
"cost_for_plan": 2.605126953
42684249
}
42694250
]
42704251
},
@@ -4328,8 +4309,7 @@ explain select * from (select rand() from t1)q {
43284309
}
43294310
},
43304311
"rows_for_plan": 3,
4331-
"cost_for_plan": 3.6,
4332-
"estimated_join_cardinality": 3
4312+
"cost_for_plan": 3.6
43334313
}
43344314
]
43354315
},
@@ -4557,8 +4537,7 @@ explain select * from t1 where a in (select t_inner_1.a from t1 t_inner_1, t1 t_
45574537
}
45584538
},
45594539
"rows_for_plan": 9,
4560-
"cost_for_plan": 6.410253906,
4561-
"estimated_join_cardinality": 9
4540+
"cost_for_plan": 6.410253906
45624541
}
45634542
]
45644543
},
@@ -4678,8 +4657,7 @@ explain select * from t1 where a in (select t_inner_1.a from t1 t_inner_1, t1 t_
46784657
{
46794658
"chosen_strategy": "SJ-Materialization"
46804659
}
4681-
],
4682-
"estimated_join_cardinality": 3
4660+
]
46834661
}
46844662
]
46854663
},
@@ -5222,8 +5200,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) {
52225200
{
52235201
"chosen_strategy": "DuplicateWeedout"
52245202
}
5225-
],
5226-
"estimated_join_cardinality": 27
5203+
]
52275204
}
52285205
]
52295206
},
@@ -5345,8 +5322,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) {
53455322
{
53465323
"chosen_strategy": "DuplicateWeedout"
53475324
}
5348-
],
5349-
"estimated_join_cardinality": 27
5325+
]
53505326
}
53515327
]
53525328
},
@@ -6667,8 +6643,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) {
66676643
}
66686644
},
66696645
"rows_for_plan": 27,
6670-
"cost_for_plan": 10.02050781,
6671-
"estimated_join_cardinality": 27
6646+
"cost_for_plan": 10.02050781
66726647
}
66736648
]
66746649
},
@@ -6741,8 +6716,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) {
67416716
}
67426717
},
67436718
"rows_for_plan": 27,
6744-
"cost_for_plan": 10.02050781,
6745-
"estimated_join_cardinality": 27
6719+
"cost_for_plan": 10.02050781
67466720
}
67476721
]
67486722
},
@@ -6961,8 +6935,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) {
69616935
{
69626936
"chosen_strategy": "SJ-Materialization"
69636937
}
6964-
],
6965-
"estimated_join_cardinality": 27
6938+
]
69666939
}
69676940
]
69686941
},
@@ -8124,8 +8097,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
81248097
}
81258098
},
81268099
"rows_for_plan": 4777.832031,
8127-
"cost_for_plan": 1216.438354,
8128-
"estimated_join_cardinality": 4777.832031
8100+
"cost_for_plan": 1216.438354
81298101
}
81308102
]
81318103
},
@@ -8466,7 +8438,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
84668438
"rows_for_plan": 10,
84678439
"cost_for_plan": 26.0278306,
84688440
"cost_for_sorting": 10,
8469-
"estimated_join_cardinality": 10
8441+
"pruned_by_hanging_leaf": true
84708442
}
84718443
]
84728444
},
@@ -8786,8 +8758,7 @@ select count(*) from seq_1_to_10000000 {
87868758
}
87878759
},
87888760
"rows_for_plan": 10000000,
8789-
"cost_for_plan": 12000000,
8790-
"estimated_join_cardinality": 10000000
8761+
"cost_for_plan": 12000000
87918762
}
87928763
]
87938764
},
@@ -9202,8 +9173,7 @@ json_detailed(json_extract(trace, '$**.choose_best_splitting'))
92029173
},
92039174
"rows_for_plan": 1.8367,
92049175
"cost_for_plan": 2.367925794,
9205-
"cost_for_sorting": 1.8367,
9206-
"estimated_join_cardinality": 1.8367
9176+
"cost_for_sorting": 1.8367
92079177
}
92089178
]
92099179
},

mysql-test/main/opt_trace_index_merge.result

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,8 +221,7 @@ explain select * from t1 where a=1 or b=1 {
221221
}
222222
},
223223
"rows_for_plan": 2,
224-
"cost_for_plan": 2.884903732,
225-
"estimated_join_cardinality": 2
224+
"cost_for_plan": 2.884903732
226225
}
227226
]
228227
},

mysql-test/main/opt_trace_index_merge_innodb.result

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ explain select * from t1 where pk1 != 0 and key1 = 1 {
227227
},
228228
"rows_for_plan": 1,
229229
"cost_for_plan": 1.325146475,
230-
"estimated_join_cardinality": 1
230+
"pruned_by_hanging_leaf": true
231231
}
232232
]
233233
},

0 commit comments

Comments
 (0)