Skip to content

Commit 3907345

Browse files
committed
MDEV-33306 Optimizer choosing incorrect index in 10.6, 10.5 but not in 10.4
In MariaDB up to 10.11, the test_if_cheaper_ordering() code (that tries to optimizer how GROUP BY is executed) assumes that if a table scan is used then if there is any index usable by GROUP BY it will be used. The reason MySQL 10.4 provides a better plan is because of two differences: - Plans using 'ref' has a cost of 1/10 of what it should be (as a protection against table scans). This is why 'ref' is used in 10.4 and not in 10.5. - When 'ref' is used, then GROUP BY will not use an index for GROUP BY. In MariaDB 10.5 the chosen plan is a table scan (as it calculated to be faster) but as 'ref' is not used, the test_if_cheaper_ordering() optimizer phase decides (as ref is not usd) to use an index for GROUP BY, which has bad performance. Description of fix: - All new code is protected by the "optimizer_adjust_secondary_key_costs" variable, which is now a bit map, and is only executed if the option "disable_forced_index_in_group_by" set. - Corrects GROUP BY handling in test_if_cheaper_ordering() by making the choise of using and index with GROUP BY cost based instead of rule based. - Adds TIME_FOR_COMPARE to all costs, when using group by, to make read_time, index_scan_time and range_cost comparable. Other things: - Made optimizer_adjust_secondary_key_costs a bit map (compatible with old code). Notes: Current code ignores costs for the algorithm used when doing GROUP BY on the first table: - Create an in-memory temporary table for handling group by and doing a filesort of the result file We can probably in 10.6 continue to ignore this cost. This patch should NOT be merged to 11.0 series (not needed in 11.0).
1 parent 4106974 commit 3907345

File tree

9 files changed

+191
-53
lines changed

9 files changed

+191
-53
lines changed

mysql-test/main/mysqld--help.result

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -712,13 +712,17 @@ The following specify which files/extra groups are read (specified before remain
712712
max_connections*5 or max_connections + table_cache*2
713713
(whichever is larger) number of file descriptors
714714
(Automatically configured unless set explicitly)
715-
--optimizer-adjust-secondary-key-costs=#
716-
0 = No changes. 1 = Update secondary key costs for ranges
717-
to be at least 5x of clustered primary key costs. 2 =
718-
Remove 'max_seek optimization' for secondary keys and
719-
slight adjustment of filter cost. This option will be
720-
deleted in MariaDB 11.0 as it is not needed with the new
721-
11.0 optimizer.
715+
--optimizer-adjust-secondary-key-costs=name
716+
A bit field with the following values:
717+
adjust_secondary_key_cost = Update secondary key costs
718+
for ranges to be at least 5x of clustered primary key
719+
costs. disable_max_seek = Disable 'max_seek optimization'
720+
for secondary keys and slight adjustment of filter cost.
721+
disable_forced_index_in_group_by = Disable automatic
722+
forced index in GROUP BY. This variable will be deleted
723+
in MariaDB 11.0 as it is not needed with the new 11.0
724+
optimizer.
725+
Use 'ALL' to set all combinations.
722726
--optimizer-max-sel-arg-weight=#
723727
The maximum weight of the SEL_ARG graph. Set to 0 for no
724728
limit
@@ -1691,7 +1695,7 @@ old-alter-table DEFAULT
16911695
old-mode UTF8_IS_UTF8MB3
16921696
old-passwords FALSE
16931697
old-style-user-limits FALSE
1694-
optimizer-adjust-secondary-key-costs 0
1698+
optimizer-adjust-secondary-key-costs
16951699
optimizer-max-sel-arg-weight 32000
16961700
optimizer-max-sel-args 16000
16971701
optimizer-prune-level 1

mysql-test/main/secondary_key_costs.result

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,3 +80,38 @@ json_detailed(json_extract(@trace, '$**.considered_access_paths'))
8080
]
8181
]
8282
drop table t1, name, flag2;
83+
select @@optimizer_adjust_secondary_key_costs;
84+
@@optimizer_adjust_secondary_key_costs
85+
86+
set @@optimizer_adjust_secondary_key_costs=7;
87+
select @@optimizer_adjust_secondary_key_costs;
88+
@@optimizer_adjust_secondary_key_costs
89+
adjust_secondary_key_cost,disable_max_seek,disable_forced_index_in_group_by
90+
set @@optimizer_adjust_secondary_key_costs=default;
91+
#
92+
# MDEV-33306 Optimizer choosing incorrect index in 10.6, 10.5 but not in 10.4
93+
#
94+
create table t1 (a int primary key, b int, c int, d int, key(b),key(c)) engine=innodb;
95+
insert into t1 select seq, mod(seq,10), mod(seq,2), seq from seq_1_to_50000;
96+
explain select b, sum(d) from t1 where c=0 group by b;
97+
id select_type table type possible_keys key key_len ref rows Extra
98+
1 SIMPLE t1 index c b 5 NULL # Using where
99+
select b, sum(d) from t1 where c=0 group by b;
100+
b sum(d)
101+
0 125025000
102+
2 124985000
103+
4 124995000
104+
6 125005000
105+
8 125015000
106+
set @@optimizer_adjust_secondary_key_costs="disable_forced_index_in_group_by";
107+
explain select b, sum(d) from t1 where c=0 group by b;
108+
id select_type table type possible_keys key key_len ref rows Extra
109+
1 SIMPLE t1 ALL c NULL NULL NULL # Using where; Using temporary; Using filesort
110+
select b, sum(d) from t1 where c=0 group by b;
111+
b sum(d)
112+
0 125025000
113+
2 124985000
114+
4 124995000
115+
6 125005000
116+
8 125015000
117+
drop table t1;

mysql-test/main/secondary_key_costs.test

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
--source include/have_sequence.inc
22
--source include/not_embedded.inc
3+
--source include/have_innodb.inc
34

45
#
56
# Show the costs for rowid filter
@@ -51,3 +52,23 @@ select json_detailed(json_extract(@trace, '$**.considered_access_paths'));
5152
--enable_ps_protocol
5253

5354
drop table t1, name, flag2;
55+
56+
select @@optimizer_adjust_secondary_key_costs;
57+
set @@optimizer_adjust_secondary_key_costs=7;
58+
select @@optimizer_adjust_secondary_key_costs;
59+
set @@optimizer_adjust_secondary_key_costs=default;
60+
61+
--echo #
62+
--echo # MDEV-33306 Optimizer choosing incorrect index in 10.6, 10.5 but not in 10.4
63+
--echo #
64+
65+
create table t1 (a int primary key, b int, c int, d int, key(b),key(c)) engine=innodb;
66+
insert into t1 select seq, mod(seq,10), mod(seq,2), seq from seq_1_to_50000;
67+
--replace_column 9 #
68+
explain select b, sum(d) from t1 where c=0 group by b;
69+
select b, sum(d) from t1 where c=0 group by b;
70+
set @@optimizer_adjust_secondary_key_costs="disable_forced_index_in_group_by";
71+
--replace_column 9 #
72+
explain select b, sum(d) from t1 where c=0 group by b;
73+
select b, sum(d) from t1 where c=0 group by b;
74+
drop table t1;

mysql-test/suite/sys_vars/r/sysvars_server_embedded.result

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2274,12 +2274,12 @@ READ_ONLY YES
22742274
COMMAND_LINE_ARGUMENT REQUIRED
22752275
VARIABLE_NAME OPTIMIZER_ADJUST_SECONDARY_KEY_COSTS
22762276
VARIABLE_SCOPE SESSION
2277-
VARIABLE_TYPE BIGINT UNSIGNED
2278-
VARIABLE_COMMENT 0 = No changes. 1 = Update secondary key costs for ranges to be at least 5x of clustered primary key costs. 2 = Remove 'max_seek optimization' for secondary keys and slight adjustment of filter cost. This option will be deleted in MariaDB 11.0 as it is not needed with the new 11.0 optimizer.
2279-
NUMERIC_MIN_VALUE 0
2280-
NUMERIC_MAX_VALUE 2
2281-
NUMERIC_BLOCK_SIZE 1
2282-
ENUM_VALUE_LIST NULL
2277+
VARIABLE_TYPE SET
2278+
VARIABLE_COMMENT A bit field with the following values: adjust_secondary_key_cost = Update secondary key costs for ranges to be at least 5x of clustered primary key costs. disable_max_seek = Disable 'max_seek optimization' for secondary keys and slight adjustment of filter cost. disable_forced_index_in_group_by = Disable automatic forced index in GROUP BY. This variable will be deleted in MariaDB 11.0 as it is not needed with the new 11.0 optimizer.
2279+
NUMERIC_MIN_VALUE NULL
2280+
NUMERIC_MAX_VALUE NULL
2281+
NUMERIC_BLOCK_SIZE NULL
2282+
ENUM_VALUE_LIST adjust_secondary_key_cost,disable_max_seek,disable_forced_index_in_group_by
22832283
READ_ONLY NO
22842284
COMMAND_LINE_ARGUMENT REQUIRED
22852285
VARIABLE_NAME OPTIMIZER_MAX_SEL_ARGS

mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2434,12 +2434,12 @@ READ_ONLY YES
24342434
COMMAND_LINE_ARGUMENT REQUIRED
24352435
VARIABLE_NAME OPTIMIZER_ADJUST_SECONDARY_KEY_COSTS
24362436
VARIABLE_SCOPE SESSION
2437-
VARIABLE_TYPE BIGINT UNSIGNED
2438-
VARIABLE_COMMENT 0 = No changes. 1 = Update secondary key costs for ranges to be at least 5x of clustered primary key costs. 2 = Remove 'max_seek optimization' for secondary keys and slight adjustment of filter cost. This option will be deleted in MariaDB 11.0 as it is not needed with the new 11.0 optimizer.
2439-
NUMERIC_MIN_VALUE 0
2440-
NUMERIC_MAX_VALUE 2
2441-
NUMERIC_BLOCK_SIZE 1
2442-
ENUM_VALUE_LIST NULL
2437+
VARIABLE_TYPE SET
2438+
VARIABLE_COMMENT A bit field with the following values: adjust_secondary_key_cost = Update secondary key costs for ranges to be at least 5x of clustered primary key costs. disable_max_seek = Disable 'max_seek optimization' for secondary keys and slight adjustment of filter cost. disable_forced_index_in_group_by = Disable automatic forced index in GROUP BY. This variable will be deleted in MariaDB 11.0 as it is not needed with the new 11.0 optimizer.
2439+
NUMERIC_MIN_VALUE NULL
2440+
NUMERIC_MAX_VALUE NULL
2441+
NUMERIC_BLOCK_SIZE NULL
2442+
ENUM_VALUE_LIST adjust_secondary_key_cost,disable_max_seek,disable_forced_index_in_group_by
24432443
READ_ONLY NO
24442444
COMMAND_LINE_ARGUMENT REQUIRED
24452445
VARIABLE_NAME OPTIMIZER_MAX_SEL_ARGS

sql/sql_class.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -712,6 +712,11 @@ typedef struct system_variables
712712
ulonglong sortbuff_size;
713713
ulonglong default_regex_flags;
714714
ulonglong max_mem_used;
715+
/*
716+
A bitmap of OPTIMIZER_ADJ_* flags (defined in sql_priv.h).
717+
See sql_vars.cc:adjust_secondary_key_cost for symbolic names.
718+
*/
719+
ulonglong optimizer_adjust_secondary_key_costs;
715720

716721
/**
717722
Place holders to store Multi-source variables in sys_var.cc during
@@ -761,7 +766,6 @@ typedef struct system_variables
761766
ulong optimizer_max_sel_arg_weight;
762767
ulong optimizer_max_sel_args;
763768
ulong optimizer_trace_max_mem_size;
764-
ulong optimizer_adjust_secondary_key_costs;
765769
ulong use_stat_tables;
766770
double sample_percentage;
767771
ulong histogram_size;

sql/sql_priv.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,13 @@
268268
OPTIMIZER_SWITCH_COND_PUSHDOWN_FROM_HAVING | \
269269
OPTIMIZER_SWITCH_OPTIMIZE_JOIN_BUFFER_SIZE)
270270

271+
/*
272+
See adjust_secondary_key_cost in sys_vars.cc for symbolic names.
273+
*/
274+
#define OPTIMIZER_ADJ_SEC_KEY_COST (1)
275+
#define OPTIMIZER_ADJ_DISABLE_MAX_SEEKS (2)
276+
#define OPTIMIZER_ADJ_DISABLE_FORCE_INDEX_GROUP_BY (4)
277+
271278
/*
272279
Replication uses 8 bytes to store SQL_MODE in the binary log. The day you
273280
use strictly more than 64 bits by adding one more define above, you should

sql/sql_select.cc

Lines changed: 81 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5897,7 +5897,8 @@ make_join_statistics(JOIN *join, List<TABLE_LIST> &tables_list,
58975897
*/
58985898
/* Largest integer that can be stored in double (no compiler warning) */
58995899
s->worst_seeks= (double) (1ULL << 53);
5900-
if (thd->variables.optimizer_adjust_secondary_key_costs != 2)
5900+
if ((thd->variables.optimizer_adjust_secondary_key_costs &
5901+
OPTIMIZER_ADJ_DISABLE_MAX_SEEKS) == 0)
59015902
{
59025903
s->worst_seeks= MY_MIN((double) s->found_records / 10,
59035904
(double) s->read_time*3);
@@ -7824,7 +7825,8 @@ double cost_for_index_read(const THD *thd, const TABLE *table, uint key,
78247825
{
78257826
cost= ((file->keyread_time(key, 0, records) +
78267827
file->read_time(key, 1, MY_MIN(records, worst_seeks))));
7827-
if (thd->variables.optimizer_adjust_secondary_key_costs == 1 &&
7828+
if ((thd->variables.optimizer_adjust_secondary_key_costs &
7829+
OPTIMIZER_ADJ_SEC_KEY_COST) &&
78287830
file->is_clustering_key(0))
78297831
{
78307832
/*
@@ -8020,8 +8022,9 @@ best_access_path(JOIN *join,
80208022
higher to ensure that ref|filter is not less than range over same
80218023
number of rows
80228024
*/
8023-
double filter_setup_cost= (thd->variables.
8024-
optimizer_adjust_secondary_key_costs == 2 ?
8025+
double filter_setup_cost= ((thd->variables.
8026+
optimizer_adjust_secondary_key_costs &
8027+
OPTIMIZER_ADJ_DISABLE_MAX_SEEKS) ?
80258028
1.0 : 0.0);
80268029
MY_BITMAP *eq_join_set= &s->table->eq_join_set;
80278030
KEYUSE *hj_start_key= 0;
@@ -30119,12 +30122,13 @@ test_if_cheaper_ordering(const JOIN_TAB *tab, ORDER *order, TABLE *table,
3011930122
uint best_key_parts= 0;
3012030123
int best_key_direction= 0;
3012130124
ha_rows best_records= 0;
30122-
double read_time;
30125+
double read_time, records;
3012330126
int best_key= -1;
3012430127
bool is_best_covering= FALSE;
3012530128
double fanout= 1;
3012630129
ha_rows table_records= table->stat_records();
3012730130
bool group= join && join->group && order == join->group_list;
30131+
bool group_forces_index_usage= group;
3012830132
ha_rows refkey_rows_estimate= table->opt_range_condition_rows;
3012930133
const bool has_limit= (select_limit_arg != HA_POS_ERROR);
3013030134
THD* thd= join ? join->thd : table->in_use;
@@ -30161,6 +30165,7 @@ test_if_cheaper_ordering(const JOIN_TAB *tab, ORDER *order, TABLE *table,
3016130165
{
3016230166
uint tablenr= (uint)(tab - join->join_tab);
3016330167
read_time= join->best_positions[tablenr].read_time;
30168+
records= join->best_positions[tablenr].records_read;
3016430169
for (uint i= tablenr+1; i < join->table_count; i++)
3016530170
{
3016630171
fanout*= join->best_positions[i].records_read; // fanout is always >= 1
@@ -30169,8 +30174,23 @@ test_if_cheaper_ordering(const JOIN_TAB *tab, ORDER *order, TABLE *table,
3016930174
}
3017030175
}
3017130176
else
30177+
{
3017230178
read_time= table->file->scan_time();
30179+
records= rows2double(table_records);
30180+
}
3017330181

30182+
if ((thd->variables.optimizer_adjust_secondary_key_costs &
30183+
OPTIMIZER_ADJ_DISABLE_FORCE_INDEX_GROUP_BY) && group)
30184+
{
30185+
/*
30186+
read_time does not include TIME_FOR_COMPARE while opt_range.cost, which
30187+
is used by index_scan_time contains it.
30188+
Ensure that read_time and index_scan_time always include it to make
30189+
costs comparable.
30190+
*/
30191+
read_time+= records/TIME_FOR_COMPARE;
30192+
}
30193+
3017430194
trace_cheaper_ordering.add("fanout", fanout);
3017530195
/*
3017630196
TODO: add cost of sorting here.
@@ -30361,30 +30381,62 @@ test_if_cheaper_ordering(const JOIN_TAB *tab, ORDER *order, TABLE *table,
3036130381
possible_key.add("updated_limit", select_limit);
3036230382
rec_per_key= keyinfo->actual_rec_per_key(keyinfo->user_defined_key_parts-1);
3036330383
set_if_bigger(rec_per_key, 1);
30364-
/*
30365-
Here we take into account the fact that rows are
30366-
accessed in sequences rec_per_key records in each.
30367-
Rows in such a sequence are supposed to be ordered
30368-
by rowid/primary key. When reading the data
30369-
in a sequence we'll touch not more pages than the
30370-
table file contains.
30371-
TODO. Use the formula for a disk sweep sequential access
30372-
to calculate the cost of accessing data rows for one
30373-
index entry.
30374-
*/
30375-
index_scan_time= select_limit/rec_per_key *
30376-
MY_MIN(rec_per_key, table->file->scan_time());
30377-
double range_scan_time;
30378-
if (get_range_limit_read_cost(tab, table, table_records, nr,
30379-
select_limit, &range_scan_time))
30384+
30385+
if ((thd->variables.optimizer_adjust_secondary_key_costs &
30386+
OPTIMIZER_ADJ_DISABLE_FORCE_INDEX_GROUP_BY) && group)
30387+
{
30388+
/* Special optimization to avoid forcing an index when group by is used */
30389+
group_forces_index_usage= 0;
30390+
30391+
if (table->opt_range_keys.is_set(nr))
30392+
{
30393+
/* opt_range includes TIME_FOR_COMPARE */
30394+
index_scan_time= (double) table->opt_range[nr].cost;
30395+
}
30396+
else
30397+
{
30398+
/* Enable secondary_key_cost and disable max_seek option */
30399+
ulonglong save= thd->variables.optimizer_adjust_secondary_key_costs;
30400+
thd->variables.optimizer_adjust_secondary_key_costs|=
30401+
OPTIMIZER_ADJ_SEC_KEY_COST | OPTIMIZER_ADJ_DISABLE_MAX_SEEKS;
30402+
30403+
index_scan_time= cost_for_index_read(thd, table, nr,
30404+
table_records, HA_ROWS_MAX);
30405+
index_scan_time+= rows2double(table_records) / TIME_FOR_COMPARE;
30406+
thd->variables.optimizer_adjust_secondary_key_costs= save;
30407+
}
30408+
/* Assume data is proportionalyl distributed */
30409+
index_scan_time*= MY_MIN(select_limit, rec_per_key) / rec_per_key;
30410+
}
30411+
else
3038030412
{
30381-
possible_key.add("range_scan_time", range_scan_time);
30382-
if (range_scan_time < index_scan_time)
30383-
index_scan_time= range_scan_time;
30413+
/*
30414+
Here we take into account the fact that rows are
30415+
accessed in sequences rec_per_key records in each.
30416+
Rows in such a sequence are supposed to be ordered
30417+
by rowid/primary key. When reading the data
30418+
in a sequence we'll touch not more pages than the
30419+
table file contains.
30420+
TODO. Use the formula for a disk sweep sequential access
30421+
to calculate the cost of accessing data rows for one
30422+
index entry.
30423+
*/
30424+
index_scan_time= select_limit/rec_per_key *
30425+
MY_MIN(rec_per_key, table->file->scan_time());
30426+
30427+
double range_scan_time;
30428+
if (get_range_limit_read_cost(tab, table, table_records, nr,
30429+
select_limit, &range_scan_time))
30430+
{
30431+
possible_key.add("range_scan_time", range_scan_time);
30432+
if (range_scan_time < index_scan_time)
30433+
index_scan_time= range_scan_time;
30434+
}
3038430435
}
3038530436
possible_key.add("index_scan_time", index_scan_time);
3038630437

30387-
if ((ref_key < 0 && (group || table->force_index || is_covering)) ||
30438+
if ((ref_key < 0 &&
30439+
(group_forces_index_usage || table->force_index || is_covering)) ||
3038830440
index_scan_time < read_time)
3038930441
{
3039030442
ha_rows quick_records= table_records;
@@ -30406,6 +30458,7 @@ test_if_cheaper_ordering(const JOIN_TAB *tab, ORDER *order, TABLE *table,
3040630458
possible_key.add("cause", "ref estimates better");
3040730459
continue;
3040830460
}
30461+
3040930462
if (table->opt_range_keys.is_set(nr))
3041030463
quick_records= table->opt_range[nr].rows;
3041130464
possible_key.add("records", quick_records);
@@ -30424,6 +30477,9 @@ test_if_cheaper_ordering(const JOIN_TAB *tab, ORDER *order, TABLE *table,
3042430477
is_best_covering= is_covering;
3042530478
best_key_direction= direction;
3042630479
best_select_limit= select_limit;
30480+
if ((thd->variables.optimizer_adjust_secondary_key_costs &
30481+
OPTIMIZER_ADJ_DISABLE_FORCE_INDEX_GROUP_BY) && group)
30482+
set_if_smaller(read_time, index_scan_time);
3042730483
}
3042830484
else
3042930485
{

sql/sys_vars.cc

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2817,17 +2817,28 @@ static Sys_var_ulong Sys_optimizer_trace_max_mem_size(
28172817
SESSION_VAR(optimizer_trace_max_mem_size), CMD_LINE(REQUIRED_ARG),
28182818
VALID_RANGE(0, ULONG_MAX), DEFAULT(1024 * 1024), BLOCK_SIZE(1));
28192819

2820-
static Sys_var_ulong Sys_optimizer_adjust_secondary_key_costs(
2820+
2821+
/*
2822+
Symbolic names for OPTIMIZER_ADJ_* flags in sql_priv.h
2823+
*/
2824+
static const char *adjust_secondary_key_cost[]=
2825+
{
2826+
"adjust_secondary_key_cost", "disable_max_seek", "disable_forced_index_in_group_by", 0
2827+
};
2828+
2829+
2830+
static Sys_var_set Sys_optimizer_adjust_secondary_key_costs(
28212831
"optimizer_adjust_secondary_key_costs",
2822-
"0 = No changes. "
2823-
"1 = Update secondary key costs for ranges to be at least 5x of clustered "
2824-
"primary key costs. "
2825-
"2 = Remove 'max_seek optimization' for secondary keys and slight "
2832+
"A bit field with the following values: "
2833+
"adjust_secondary_key_cost = Update secondary key costs for ranges to be at least "
2834+
"5x of clustered primary key costs. "
2835+
"disable_max_seek = Disable 'max_seek optimization' for secondary keys and slight "
28262836
"adjustment of filter cost. "
2827-
"This option will be deleted in MariaDB 11.0 as it is not needed with the "
2837+
"disable_forced_index_in_group_by = Disable automatic forced index in GROUP BY. "
2838+
"This variable will be deleted in MariaDB 11.0 as it is not needed with the "
28282839
"new 11.0 optimizer.",
28292840
SESSION_VAR(optimizer_adjust_secondary_key_costs), CMD_LINE(REQUIRED_ARG),
2830-
VALID_RANGE(0, 2), DEFAULT(0), BLOCK_SIZE(1));
2841+
adjust_secondary_key_cost, DEFAULT(0));
28312842

28322843

28332844
static Sys_var_charptr_fscs Sys_pid_file(

0 commit comments

Comments
 (0)