Details
-
Bug
-
Status: Closed (View Workflow)
-
Major
-
Resolution: Fixed
-
10.0.9
-
None
Description
create table ten(a int);
|
insert into ten values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
create table t1(key1 int, col1 int, key(key1));
|
insert into t1 select A.a, A.a from ten A, ten B, ten C;
|
|
set histogram_size=100;
|
set use_stat_tables='preferably';
|
set optimizer_use_condition_selectivity=4;
|
analyze table t1 persistent for all;
|
mysql> explain extended select * from t1 where col1=2;
|
+------+-------------+-------+------+---------------+------+---------+------+------+----------+-------------+
|
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
|
+------+-------------+-------+------+---------------+------+---------+------+------+----------+-------------+
|
| 1 | SIMPLE | t1 | ALL | NULL | NULL | NULL | NULL | 1000 | 9.90 | Using where |
|
+------+-------------+-------+------+---------------+------+---------+------+------+----------+-------------+
|
This is ok.
mysql> explain extended select * from t1 where key1=2;
|
+------+-------------+-------+------+---------------+------+---------+-------+------+----------+-------+
|
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
|
+------+-------------+-------+------+---------------+------+---------+-------+------+----------+-------+
|
| 1 | SIMPLE | t1 | ref | key1 | key1 | 5 | const | 100 | 10.00 | |
|
+------+-------------+-------+------+---------------+------+---------+-------+------+----------+-------+
|
This is not ok. "key1=2" is used for ref access. However, its selectivity is still present in "filtered%". Ref access is employed when a condition is very selective, counting its selectivity twice will cause gross under-estimation of output cardinality.
Attachments
Activity
Field | Original Value | New Value |
---|---|---|
Assignee | Igor Babaev [ igor ] |
Assignee | Igor Babaev [ igor ] | Sergei Petrunia [ psergey ] |
Status | Open [ 1 ] | In Progress [ 3 ] |
Description |
{noformat} create table ten(a int); insert into ten values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); create table t1(key1 int, col1 int, key(key1)); insert into t1 select A.a, A.a from ten A, ten B, ten C; set histogram_size=100; set use_stat_tables='preferably'; set optimizer_use_condition_selectivity=4; analyze table t1 persistent for all; {noformat} {noformat} mysql> explain extended select * from t1 where col1=2; +------+-------------+-------+------+---------------+------+---------+------+------+----------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +------+-------------+-------+------+---------------+------+---------+------+------+----------+-------------+ | 1 | SIMPLE | t1 | ALL | NULL | NULL | NULL | NULL | 1000 | 9.90 | Using where | +------+-------------+-------+------+---------------+------+---------+------+------+----------+-------------+ {noformat} {noformat} mysql> explain extended select * from t1 where key1=2; +------+-------------+-------+------+---------------+------+---------+-------+------+----------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +------+-------------+-------+------+---------------+------+---------+-------+------+----------+-------+ | 1 | SIMPLE | t1 | ref | key1 | key1 | 5 | const | 100 | 10.00 | | +------+-------------+-------+------+---------------+------+---------+-------+------+----------+-------+ {noformat} |
{noformat} create table ten(a int); insert into ten values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); create table t1(key1 int, col1 int, key(key1)); insert into t1 select A.a, A.a from ten A, ten B, ten C; set histogram_size=100; set use_stat_tables='preferably'; set optimizer_use_condition_selectivity=4; analyze table t1 persistent for all; {noformat} {noformat} mysql> explain extended select * from t1 where col1=2; +------+-------------+-------+------+---------------+------+---------+------+------+----------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +------+-------------+-------+------+---------------+------+---------+------+------+----------+-------------+ | 1 | SIMPLE | t1 | ALL | NULL | NULL | NULL | NULL | 1000 | 9.90 | Using where | +------+-------------+-------+------+---------------+------+---------+------+------+----------+-------------+ {noformat} This is ok. {noformat} mysql> explain extended select * from t1 where key1=2; +------+-------------+-------+------+---------------+------+---------+-------+------+----------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +------+-------------+-------+------+---------------+------+---------+-------+------+----------+-------+ | 1 | SIMPLE | t1 | ref | key1 | key1 | 5 | const | 100 | 10.00 | | +------+-------------+-------+------+---------------+------+---------+-------+------+----------+-------+ {noformat} This is not ok. "key1=2" is used for ref access. However, its selectivity is still present in "filtered%". Ref access is employed when a condition is very selective, counting its selectivity twice will cause gross under-estimation of output cardinality. |
Labels | eits |
Fix Version/s | 10.0.11 [ 15200 ] | |
Fix Version/s | 10.0.10 [ 14500 ] |
Resolution | Fixed [ 1 ] | |
Status | In Progress [ 3 ] | Closed [ 6 ] |
Workflow | defaullt [ 37802 ] | MariaDB v2 [ 43654 ] |
Workflow | MariaDB v2 [ 43654 ] | MariaDB v3 [ 63682 ] |
Workflow | MariaDB v3 [ 63682 ] | MariaDB v4 [ 147719 ] |
We should recongize it as an equality that was bound by ref and so discount its
selectivity (the selectivity comes from ... range... how do we figure out that
ref-bound equality has contributed as a possible range scan?)
Idea: keep array of induced selectivity
table->added_selectivity[field_no] = 0.123456
and if $field_no is used for ref access, than it's not contributing to
selectivity, and we remove its selectivity from the product.
Q: what to do about range accesses that span multiple key parts? It's not
possible to remove one key part from selectivity calculations...