Commit c21dbf27 authored by sergefp@mysql.com's avatar sergefp@mysql.com
Browse files

BUG#35850 "Performance regression in 5.1.23/5.1.24"

- Disable the "prefer full scan on clustered primary key over full scan
  of any secondary key" rule introduced by BUG#35850.
- Update test results accordingly 
(bk trigger: file this for BUG#35850)
parent f315e663
Loading
Loading
Loading
Loading
+15 −15
Original line number Diff line number Diff line
@@ -925,7 +925,7 @@ id select_type table type possible_keys key key_len ref rows Extra
1	SIMPLE	t1	index	NULL	b	4	NULL	#	Using index
explain select a,b from t1;
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	t1	index	NULL	PRIMARY	4	NULL	#	
1	SIMPLE	t1	index	NULL	b	4	NULL	#	Using index
explain select a,b,c from t1;
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	#	
@@ -1166,14 +1166,14 @@ UPDATE t1 set a=a+100 where b between 2 and 3 and a < 1000;
SELECT * from t1;
a	b
1	1
102	2
103	3
4	4
5	5
6	6
7	7
8	8
9	9
102	2
103	3
drop table t1;
CREATE TABLE t1 (a int not null primary key, b int not null, key (b)) engine=innodb;
CREATE TABLE t2 (a int not null primary key, b int not null, key (b)) engine=innodb;
@@ -1197,6 +1197,7 @@ a b
update t1,t2 set t1.a=t1.a+100 where t1.a=101;
select * from t1;
a	b
201	1
102	2
103	3
104	4
@@ -1208,11 +1209,10 @@ a b
110	10
111	11
112	12
201	1
update t1,t2 set t1.b=t1.b+10 where t1.b=2;
select * from t1;
a	b
102	12
201	1
103	3
104	4
105	5
@@ -1222,34 +1222,34 @@ a b
109	9
110	10
111	11
102	12
112	12
201	1
update t1,t2 set t1.b=t1.b+2,t2.b=t1.b+10 where t1.b between 3 and 5 and t1.a=t2.a+100;
select * from t1;
a	b
102	12
201	1
103	5
104	6
105	7
106	6
105	7
107	7
108	8
109	9
110	10
111	11
102	12
112	12
201	1
select * from t2;
a	b
1	1
2	2
3	13
4	14
5	15
6	6
7	7
8	8
9	9
3	13
4	14
5	15
drop table t1,t2;
CREATE TABLE t2 (   NEXT_T         BIGINT NOT NULL PRIMARY KEY) ENGINE=MyISAM;
CREATE TABLE t1 (  B_ID           INTEGER NOT NULL PRIMARY KEY) ENGINE=InnoDB;
@@ -1300,11 +1300,11 @@ insert into t1 (id) values (null),(null),(null),(null),(null);
update t1 set fk=69 where fk is null order by id limit 1;
SELECT * from t1;
id	fk
1	69
2	NULL
3	NULL
4	NULL
5	NULL
1	69
drop table t1;
create table t1 (a int not null, b int not null, key (a));
insert into t1 values (1,1),(1,2),(1,3),(3,1),(3,2),(3,3),(3,1),(3,2),(3,3),(2,1),(2,2),(2,3);
@@ -2438,8 +2438,8 @@ insert into t1 (b) values (1);
replace into t1 (b) values (2), (1), (3);
select * from t1;
a	b
2	2
3	1
2	2
4	3
truncate table t1;
insert into t1 (b) values (1);
@@ -2448,8 +2448,8 @@ replace into t1 (b) values (1);
replace into t1 (b) values (3);
select * from t1;
a	b
2	2
3	1
2	2
4	3
drop table t1;
create table t1 (rowid int not null auto_increment, val int not null,primary
+18 −8
Original line number Diff line number Diff line
@@ -355,13 +355,13 @@ EXPLAIN
SELECT COUNT(*) FROM t2 LEFT JOIN t1 ON t2.fkey = t1.id
WHERE t1.name LIKE 'A%';
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	t1	index	PRIMARY,name	PRIMARY	4	NULL	3	Using where
1	SIMPLE	t1	index	PRIMARY,name	name	23	NULL	3	Using where; Using index
1	SIMPLE	t2	ref	fkey	fkey	5	test.t1.id	1	Using where; Using index
EXPLAIN
SELECT COUNT(*) FROM t2 LEFT JOIN t1 ON t2.fkey = t1.id
WHERE t1.name LIKE 'A%' OR FALSE;
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	t2	index	NULL	PRIMARY	4	NULL	5	
1	SIMPLE	t2	index	NULL	fkey	5	NULL	5	Using index
1	SIMPLE	t1	eq_ref	PRIMARY	PRIMARY	4	test.t2.fkey	1	Using where
DROP TABLE t1,t2;
CREATE TABLE t1 (
@@ -1268,11 +1268,11 @@ select_type SIMPLE
table	t1
type	index
possible_keys	NULL
key	PRIMARY
key_len	4
key	b
key_len	5
ref	NULL
rows	3
Extra	Using filesort
Extra	Using index; Using filesort
SELECT * FROM t1 ORDER BY b ASC, a DESC;
a	b
1	1
@@ -1284,11 +1284,11 @@ select_type SIMPLE
table	t1
type	index
possible_keys	NULL
key	PRIMARY
key_len	4
key	b
key_len	5
ref	NULL
rows	3
Extra	Using filesort
Extra	Using index; Using filesort
SELECT * FROM t1 ORDER BY b DESC, a ASC;
a	b
2	2
@@ -1654,3 +1654,13 @@ ALTER TABLE t1 CHANGE id id2 INT;
DROP TABLE t2;
DROP TABLE t1;
End of 5.1 tests
drop table if exists t1, t2, t3;
create table t1(a int);
insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
create table t2 (a int, b int, pk int, key(a,b), primary key(pk)) engine=innodb;
insert into t2 select @a:=A.a+10*(B.a + 10*C.a),@a, @a from t1 A, t1 B, t1 C;
this must use key 'a', not PRIMARY:
explain select a from t2 where a=b;
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	t2	index	NULL	a	10	NULL	#	Using where; Using index
drop table t1, t2;
+2 −2
Original line number Diff line number Diff line
@@ -8,12 +8,12 @@ EXPLAIN
SELECT COUNT(*) FROM t2 LEFT JOIN t1 ON t2.fkey = t1.id 
WHERE t1.name LIKE 'A%';
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	t1	index	PRIMARY,name	PRIMARY	4	NULL	3	Using where
1	SIMPLE	t1	index	PRIMARY,name	name	23	NULL	3	Using where; Using index
1	SIMPLE	t2	ref	fkey	fkey	5	test.t1.id	1	Using where; Using index
EXPLAIN
SELECT COUNT(*) FROM t2 LEFT JOIN t1 ON t2.fkey = t1.id 
WHERE t1.name LIKE 'A%' OR FALSE;
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	t2	index	NULL	PRIMARY	4	NULL	5	
1	SIMPLE	t2	index	NULL	fkey	5	NULL	5	Using index
1	SIMPLE	t1	eq_ref	PRIMARY	PRIMARY	4	test.t2.fkey	1	Using where
DROP TABLE t1,t2;
+16 −0
Original line number Diff line number Diff line
@@ -13,3 +13,19 @@ let $test_foreign_keys= 1;
set global innodb_support_xa=default;
set session innodb_support_xa=default;
--source include/mix1.inc

--disable_warnings
drop table if exists t1, t2, t3;
--enable_warnings
#
# BUG#35850: Performance regression in 5.1.23/5.1.24
#
create table t1(a int);
insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
create table t2 (a int, b int, pk int, key(a,b), primary key(pk)) engine=innodb;
insert into t2 select @a:=A.a+10*(B.a + 10*C.a),@a, @a from t1 A, t1 B, t1 C;
--echo this must use key 'a', not PRIMARY:
--replace_column 9 #
explain select a from t2 where a=b;
drop table t1, t2;
+6 −3
Original line number Diff line number Diff line
@@ -6506,13 +6506,16 @@ make_join_readinfo(JOIN *join, ulonglong options)
		   !(tab->select && tab->select->quick))
	  {					// Only read index tree
	    /*
	      See bug #26447: "Using the clustered index for a table scan
	      is always faster than using a secondary index".
	    */
            It has turned out that the below change, while speeding things
            up for disk-bound loads, slows them down for cases when the data
            is in disk cache (see BUG#35850):
	    //  See bug #26447: "Using the clustered index for a table scan
	    //  is always faster than using a secondary index".
            if (table->s->primary_key != MAX_KEY &&
                table->file->primary_key_is_clustered())
              tab->index= table->s->primary_key;
            else
	    */
              tab->index=find_shortest_key(table, & table->covering_keys);
	    tab->read_first_record= join_read_first;
	    tab->type=JT_NEXT;		// Read with index_first / index_next