Public bug reported:

When persistent statistics is used for InnoDB it still updates
cardinality with values which are incorrect.

Can be related to https://bugs.launchpad.net/percona-server/+bug/1484311
(but exists in 5.7.10) and http://bugs.mysql.com/bug.php?id=75428

How to repeat:

Option file:

--innodb_stats_auto_recalc=0 --innodb_stats_method=nulls_equal
--innodb_stats_on_metadata=0 --innodb_stats_persistent=1
--innodb_stats_persistent_sample_pages=1000
--innodb_stats_sample_pages=8 --innodb_stats_transient_sample_pages=8

Test file:

--source include/have_innodb.inc

create table sale
(
id int primary key auto_increment,
customer_id int not null,
product_id int not null,
sale_time datetime not null,
sale_value decimal(10,2) not null,
filler varchar(250) not null,
key(customer_id, sale_time),
key(product_id)
)
engine innodb STATS_AUTO_RECALC=0 STATS_SAMPLE_PAGES=1000;

 insert into sale
(customer_id,product_id,sale_time,sale_value,filler)
values
(1,1,NOW(),100,LPAD('X',250,'X')),
(1,2,NOW(),200,LPAD('X',250,'X')),
(1,3,NOW(),300,LPAD('X',250,'X')),
(2,4,NOW(),100,LPAD('X',250,'X')),
(2,5,NOW(),200,LPAD('X',250,'X')),
(3,6,NOW(),100,LPAD('X',250,'X'));

insert into sale (customer_id, product_id, sale_time, sale_value, filler) 
select customer_id, product_id, NOW(), sale_value, filler from sale;
insert into sale (customer_id, product_id, sale_time, sale_value, filler) 
select customer_id, product_id, NOW(), sale_value, filler from sale;
insert into sale (customer_id, product_id, sale_time, sale_value, filler) 
select customer_id, product_id, NOW(), sale_value, filler from sale;
insert into sale (customer_id, product_id, sale_time, sale_value, filler) 
select customer_id, product_id, NOW(), sale_value, filler from sale;
insert into sale (customer_id, product_id, sale_time, sale_value, filler) 
select customer_id, product_id, NOW(), sale_value, filler from sale;
insert into sale (customer_id, product_id, sale_time, sale_value, filler) 
select customer_id, product_id, NOW(), sale_value, filler from sale;

show indexes from sale;
select count(distinct customer_id), count(distinct sale_time), count(distinct 
product_id) from sale;
select count(*), count(distinct customer_id), count(distinct customer_id, 
sale_time), count(distinct product_id) from sale;
analyze table sale;
show indexes from sale;

insert into sale (customer_id, product_id, sale_time, sale_value, filler) 
select customer_id, product_id, NOW(), sale_value, filler from sale where id < 
441/5;
show indexes from sale;
select count(distinct customer_id), count(distinct sale_time), count(distinct 
product_id) from sale;
select count(*), count(distinct customer_id), count(distinct customer_id, 
sale_time), count(distinct product_id) from sale;
insert into sale (customer_id, product_id, sale_time, sale_value, filler) 
select customer_id, product_id, NOW(), sale_value, filler from sale where id < 
581/2;
show indexes from sale;
select count(distinct customer_id), count(distinct sale_time), count(distinct 
product_id) from sale;
select count(*), count(distinct customer_id), count(distinct customer_id, 
sale_time), count(distinct product_id) from sale;

Actual result:

show indexes from sale;
Table   Non_unique      Key_name        Seq_in_index    Column_name     
Collation       Cardinality     Sub_part        Packed  Null    Index_type      
Comment Index_comment
sale    0       PRIMARY 1       id      A       128     NULL    NULL            
BTREE
sale    1       customer_id     1       customer_id     A       128     NULL    
NULL            BTREE
sale    1       customer_id     2       sale_time       A       128     NULL    
NULL            BTREE
sale    1       product_id      1       product_id      A       128     NULL    
NULL            BTREE
select count(distinct customer_id), count(distinct sale_time), count(distinct 
product_id) from sale;
count(distinct customer_id)     count(distinct sale_time)       count(distinct 
product_id)
3       2       6
select count(*), count(distinct customer_id), count(distinct customer_id, 
sale_time), count(distinct product_id) from sale;
count(*)        count(distinct customer_id)     count(distinct customer_id, 
sale_time)  count(distinct product_id)
384     3       6       6
analyze table sale;
Table   Op      Msg_type        Msg_text
test.sale       analyze status  OK
show indexes from sale;
Table   Non_unique      Key_name        Seq_in_index    Column_name     
Collation       Cardinality     Sub_part        Packed  Null    Index_type      
Comment Index_comment
sale    0       PRIMARY 1       id      A       384     NULL    NULL            
BTREE
sale    1       customer_id     1       customer_id     A       6       NULL    
NULL            BTREE
sale    1       customer_id     2       sale_time       A       12      NULL    
NULL            BTREE
sale    1       product_id      1       product_id      A       12      NULL    
NULL            BTREE
insert into sale (customer_id, product_id, sale_time, sale_value, filler) 
select customer_id, product_id, NOW(), sale_value, filler from sale where id < 
441/5;
show indexes from sale;
Table   Non_unique      Key_name        Seq_in_index    Column_name     
Collation       Cardinality     Sub_part        Packed  Null    Index_type      
Comment Index_comment
sale    0       PRIMARY 1       id      A       461     NULL    NULL            
BTREE
sale    1       customer_id     1       customer_id     A       7       NULL    
NULL            BTREE
sale    1       customer_id     2       sale_time       A       14      NULL    
NULL            BTREE
sale    1       product_id      1       product_id      A       14      NULL    
NULL            BTREE
select count(distinct customer_id), count(distinct sale_time), count(distinct 
product_id) from sale;
count(distinct customer_id)     count(distinct sale_time)       count(distinct 
product_id)
3       3       6
select count(*), count(distinct customer_id), count(distinct customer_id, 
sale_time), count(distinct product_id) from sale;
count(*)        count(distinct customer_id)     count(distinct customer_id, 
sale_time)  count(distinct product_id)
461     3       9       6
insert into sale (customer_id, product_id, sale_time, sale_value, filler) 
select customer_id, product_id, NOW(), sale_value, filler from sale where id < 
581/2;
show indexes from sale;
Table   Non_unique      Key_name        Seq_in_index    Column_name     
Collation       Cardinality     Sub_part        Packed  Null    Index_type      
Comment Index_comment
sale    0       PRIMARY 1       id      A       694     NULL    NULL            
BTREE
sale    1       customer_id     1       customer_id     A       10      NULL    
NULL            BTREE
sale    1       customer_id     2       sale_time       A       21      NULL    
NULL            BTREE
sale    1       product_id      1       product_id      A       21      NULL    
NULL            BTREE
select count(distinct customer_id), count(distinct sale_time), count(distinct 
product_id) from sale;
count(distinct customer_id)     count(distinct sale_time)       count(distinct 
product_id)
3       4       6
select count(*), count(distinct customer_id), count(distinct customer_id, 
sale_time), count(distinct product_id) from sale;
count(*)        count(distinct customer_id)     count(distinct customer_id, 
sale_time)  count(distinct product_id)
694     3       12      6

Expected result:

all calls of show indexes from sale; (except first one) should return

show indexes from sale;
Table   Non_unique      Key_name        Seq_in_index    Column_name     
Collation       Cardinality     Sub_part        Packed  Null    Index_type      
Comment Index_comment
sale    0       PRIMARY 1       id      A       384     NULL    NULL            
BTREE
sale    1       customer_id     1       customer_id     A       6       NULL    
NULL            BTREE
sale    1       customer_id     2       sale_time       A       12      NULL    
NULL            BTREE
sale    1       product_id      1       product_id      A       12      NULL    
NULL            BTREE

** Affects: mysql-server
     Importance: Unknown
         Status: Unknown

** Affects: percona-server
     Importance: Undecided
         Status: Confirmed

** Affects: percona-server/5.6
     Importance: Undecided
         Status: Confirmed

** Affects: percona-server/5.7
     Importance: Undecided
         Status: Confirmed


** Tags: i64760

** Also affects: percona-server/5.6
   Importance: Undecided
       Status: Confirmed

** Also affects: percona-server/5.7
   Importance: Undecided
       Status: New

** Bug watch added: MySQL Bug System #80178
   http://bugs.mysql.com/bug.php?id=80178

** Also affects: mysql-server via
   http://bugs.mysql.com/bug.php?id=80178
   Importance: Unknown
       Status: Unknown

** Changed in: percona-server/5.7
       Status: New => Confirmed

-- 
You received this bug notification because you are a member of Ubuntu
Server/Client Support Team, which is subscribed to MySQL.
Matching subscriptions: Ubuntu Server/Client Support Team
https://bugs.launchpad.net/bugs/1538765

Title:
  Wrong statistics for InnoDB if persistent statistics used

To manage notifications about this bug go to:
https://bugs.launchpad.net/mysql-server/+bug/1538765/+subscriptions

-- 
Mailing list: https://launchpad.net/~enterprise-support
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~enterprise-support
More help   : https://help.launchpad.net/ListHelp

Reply via email to