From: Georgi Kodinov Date: July 3 2009 10:29am Subject: bzr commit into mysql-5.1-bugteam branch (joro:2990) Bug#36259 Bug#45828 List-Archive: http://lists.mysql.com/commits/77871 X-Bug: 36259,45828 Message-Id: <200907031029.n63ATZ8I017354@magare.gmz> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0868652048483391121==" --===============0868652048483391121== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/kgeorge/mysql/work/B45828-5.1-bugteam/ based on revid:satya.bn@stripped 2990 Georgi Kodinov 2009-07-03 Bug #36259 (Optimizing with ORDER BY) and bug#45828 (Optimizer won't use partial primary key if another index can prevent filesort The fix for bug #28404 causes the covering indexes to be preferred over non-covering in the following two cases : - when comparing the ordering indexes among themselves - when comparing the ref key to ordering indexes. Fixed by not considering the ordering indexes supperior to the ref key. They're only supperior to non-covering ordering indexes. @ mysql-test/include/mix1.inc Bug #36259: fixed a non-stable test case @ mysql-test/r/innodb_mysql.result Bug #36259 and #45828 : test case @ mysql-test/t/innodb_mysql.test Bug #36259 and #45828 : test case @ sql/sql_select.cc Bug #36259 and #45828 : don't consider covering indexes supperior to ref keys. modified: mysql-test/include/mix1.inc mysql-test/r/innodb_mysql.result mysql-test/t/innodb_mysql.test sql/sql_select.cc === modified file 'mysql-test/include/mix1.inc' --- a/mysql-test/include/mix1.inc 2009-06-15 15:57:06 +0000 +++ b/mysql-test/include/mix1.inc 2009-07-03 10:29:30 +0000 @@ -1498,9 +1498,9 @@ INSERT INTO t1 VALUES (4,1,3,'pk',NULL),(5,1,3,'c2',NULL), (2,1,4,'c_extra',NULL),(3,1,4,'c_extra',NULL); -EXPLAIN SELECT * FROM t1 WHERE tid = 1 AND vid = 3 ORDER BY idx DESC; +EXPLAIN SELECT * FROM t1 FORCE INDEX (PRIMARY) WHERE tid = 1 AND vid = 3 ORDER BY idx DESC; -SELECT * FROM t1 WHERE tid = 1 AND vid = 3 ORDER BY idx DESC; +SELECT * FROM t1 FORCE INDEX (PRIMARY) WHERE tid = 1 AND vid = 3 ORDER BY idx DESC; DROP TABLE t1; === modified file 'mysql-test/r/innodb_mysql.result' --- a/mysql-test/r/innodb_mysql.result 2009-06-15 15:57:06 +0000 +++ b/mysql-test/r/innodb_mysql.result 2009-07-03 10:29:30 +0000 @@ -1701,10 +1701,10 @@ INSERT INTO t1 VALUES (4,1,2,'c2',NULL),(5,1,2,'c1',NULL),(2,1,3,'c2',NULL),(3,1,3,'c2',NULL), (4,1,3,'pk',NULL),(5,1,3,'c2',NULL), (2,1,4,'c_extra',NULL),(3,1,4,'c_extra',NULL); -EXPLAIN SELECT * FROM t1 WHERE tid = 1 AND vid = 3 ORDER BY idx DESC; +EXPLAIN SELECT * FROM t1 FORCE INDEX (PRIMARY) WHERE tid = 1 AND vid = 3 ORDER BY idx DESC; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 index vid PRIMARY 12 NULL 16 Using where -SELECT * FROM t1 WHERE tid = 1 AND vid = 3 ORDER BY idx DESC; +1 SIMPLE t1 index NULL PRIMARY 12 NULL 16 Using where +SELECT * FROM t1 FORCE INDEX (PRIMARY) WHERE tid = 1 AND vid = 3 ORDER BY idx DESC; vid tid idx name type 3 1 4 c_extra NULL 3 1 3 c2 NULL @@ -2137,4 +2137,85 @@ GROUP BY t1.b; a b c d a b e a b 1 1 1 0 1 1 2 1 1 DROP TABLE t1, t2, t3; +# +# Bug #45828: Optimizer won't use partial primary key if another +# index can prevent filesort +# +CREATE TABLE `t1` ( +c1 int NOT NULL, +c2 int NOT NULL, +c3 int NOT NULL, +PRIMARY KEY (c1,c2), +KEY (c3) +) ENGINE=InnoDB; +INSERT INTO t1 VALUES (5,2,1246276747); +INSERT INTO t1 VALUES (2,1,1246281721); +INSERT INTO t1 VALUES (7,3,1246281756); +INSERT INTO t1 VALUES (4,2,1246282139); +INSERT INTO t1 VALUES (3,1,1246282230); +INSERT INTO t1 VALUES (1,0,1246282712); +INSERT INTO t1 VALUES (8,3,1246282765); +INSERT INTO t1 SELECT c1+10,c2+10,c3+10 FROM t1; +INSERT INTO t1 SELECT c1+100,c2+100,c3+100 from t1; +INSERT INTO t1 SELECT c1+1000,c2+1000,c3+1000 from t1; +INSERT INTO t1 SELECT c1+10000,c2+10000,c3+10000 from t1; +INSERT INTO t1 SELECT c1+100000,c2+100000,c3+100000 from t1; +INSERT INTO t1 SELECT c1+1000000,c2+1000000,c3+1000000 from t1; +SELECT * FROM t1 WHERE c1 = 99999999 AND c3 > 1 ORDER BY c3; +c1 c2 c3 +EXPLAIN SELECT * FROM t1 WHERE c1 = 99999999 AND c3 > 1 ORDER BY c3; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref PRIMARY,c3 PRIMARY 4 const 1 Using where; Using filesort +EXPLAIN SELECT * FROM t1 FORCE INDEX (PRIMARY) WHERE c1 = 99999999 AND c3 > 1 ORDER BY c3; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref PRIMARY PRIMARY 4 const 1 Using where; Using filesort +CREATE TABLE t2 ( +c1 int NOT NULL, +c2 int NOT NULL, +c3 int NOT NULL, +KEY (c1,c2), +KEY (c3) +) ENGINE=InnoDB; +explain SELECT * FROM t2 WHERE c1 = 99999999 AND c3 > 1 ORDER BY c3; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t2 ref c1,c3 c1 4 const 1 Using where; Using filesort +DROP TABLE t1,t2; +# +# 36259: Optimizing with ORDER BY +# +CREATE TABLE `testable2` ( +`col1` int(10) NOT NULL AUTO_INCREMENT, +`col2` int(10) unsigned NOT NULL DEFAULT '0', +`col3` int(10) unsigned NOT NULL DEFAULT '0', +`col4` varchar(5) DEFAULT NULL, +`col5` int(10) unsigned NOT NULL, +PRIMARY KEY (`col1`) USING BTREE, +KEY `I2` (`col2`,`col3`,`col4`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +; +insert into testable2 (col2, col3, col4, col5) values (1,1,'a', 1), (2,2,'b', 2); +insert into testable2 (col2, col3, col4, col5) select rand()*10000, rand( +)*10000, col4, col5 from testable2; +insert into testable2 (col2, col3, col4, col5) select rand()*10000, rand( +)*10000, col4, col5 from testable2; +insert into testable2 (col2, col3, col4, col5) select rand()*10000, rand( +)*10000, col4, col5 from testable2; +insert into testable2 (col2, col3, col4, col5) select rand()*10000, rand( +)*10000, col4, col5 from testable2; +insert into testable2 (col2, col3, col4, col5) select rand()*10000, rand( +)*10000, col4, col5 from testable2; +insert into testable2 (col2, col3, col4, col5) select rand()*10000, rand( +)*10000, col4, col5 from testable2; +EXPLAIN SELECT * FROM testable2 where col2=1 and col3=1 order by col1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE testable2 ref I2 I2 8 const,const 1 Using where; Using filesort +EXPLAIN SELECT * FROM testable2 force index(i2) where col2=1 and col3=1 order by +col1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE testable2 ref I2 I2 8 const,const 1 Using where; Using filesort +EXPLAIN SELECT * FROM testable2 force index(PRIMARY) where col2=1 and col3=1 order by +col1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE testable2 index NULL PRIMARY 4 NULL 128 Using where +DROP TABLE testable2; End of 5.1 tests === modified file 'mysql-test/t/innodb_mysql.test' --- a/mysql-test/t/innodb_mysql.test 2009-06-07 20:40:53 +0000 +++ b/mysql-test/t/innodb_mysql.test 2009-07-03 10:29:30 +0000 @@ -380,4 +380,94 @@ SELECT * FROM t1, t2, t3 DROP TABLE t1, t2, t3; +--echo # +--echo # Bug #45828: Optimizer won't use partial primary key if another +--echo # index can prevent filesort +--echo # + +# Create the table +CREATE TABLE `t1` ( + c1 int NOT NULL, + c2 int NOT NULL, + c3 int NOT NULL, + PRIMARY KEY (c1,c2), + KEY (c3) +) ENGINE=InnoDB; + +# populate with data +INSERT INTO t1 VALUES (5,2,1246276747); +INSERT INTO t1 VALUES (2,1,1246281721); +INSERT INTO t1 VALUES (7,3,1246281756); +INSERT INTO t1 VALUES (4,2,1246282139); +INSERT INTO t1 VALUES (3,1,1246282230); +INSERT INTO t1 VALUES (1,0,1246282712); +INSERT INTO t1 VALUES (8,3,1246282765); +INSERT INTO t1 SELECT c1+10,c2+10,c3+10 FROM t1; +INSERT INTO t1 SELECT c1+100,c2+100,c3+100 from t1; +INSERT INTO t1 SELECT c1+1000,c2+1000,c3+1000 from t1; +INSERT INTO t1 SELECT c1+10000,c2+10000,c3+10000 from t1; +INSERT INTO t1 SELECT c1+100000,c2+100000,c3+100000 from t1; +INSERT INTO t1 SELECT c1+1000000,c2+1000000,c3+1000000 from t1; + +# query and no rows will match the c1 condition, whereas all will match c3 +SELECT * FROM t1 WHERE c1 = 99999999 AND c3 > 1 ORDER BY c3; + +# SHOULD use the pk. +# index on c3 will be used instead of primary key +EXPLAIN SELECT * FROM t1 WHERE c1 = 99999999 AND c3 > 1 ORDER BY c3; + +# if we force the primary key, we can see the estimate is 1 +EXPLAIN SELECT * FROM t1 FORCE INDEX (PRIMARY) WHERE c1 = 99999999 AND c3 > 1 ORDER BY c3; + + +CREATE TABLE t2 ( + c1 int NOT NULL, + c2 int NOT NULL, + c3 int NOT NULL, + KEY (c1,c2), + KEY (c3) +) ENGINE=InnoDB; + +# SHOULD use the pk. +# if we switch it from a primary key to a regular index, it works correctly as well +explain SELECT * FROM t2 WHERE c1 = 99999999 AND c3 > 1 ORDER BY c3; + +DROP TABLE t1,t2; + + +--echo # +--echo # 36259: Optimizing with ORDER BY +--echo # + +CREATE TABLE `testable2` ( + `col1` int(10) NOT NULL AUTO_INCREMENT, + `col2` int(10) unsigned NOT NULL DEFAULT '0', + `col3` int(10) unsigned NOT NULL DEFAULT '0', + `col4` varchar(5) DEFAULT NULL, + `col5` int(10) unsigned NOT NULL, + PRIMARY KEY (`col1`) USING BTREE, + KEY `I2` (`col2`,`col3`,`col4`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +; +insert into testable2 (col2, col3, col4, col5) values (1,1,'a', 1), (2,2,'b', 2); +insert into testable2 (col2, col3, col4, col5) select rand()*10000, rand( +)*10000, col4, col5 from testable2; +insert into testable2 (col2, col3, col4, col5) select rand()*10000, rand( +)*10000, col4, col5 from testable2; +insert into testable2 (col2, col3, col4, col5) select rand()*10000, rand( +)*10000, col4, col5 from testable2; +insert into testable2 (col2, col3, col4, col5) select rand()*10000, rand( +)*10000, col4, col5 from testable2; +insert into testable2 (col2, col3, col4, col5) select rand()*10000, rand( +)*10000, col4, col5 from testable2; +insert into testable2 (col2, col3, col4, col5) select rand()*10000, rand( +)*10000, col4, col5 from testable2; +EXPLAIN SELECT * FROM testable2 where col2=1 and col3=1 order by col1; +EXPLAIN SELECT * FROM testable2 force index(i2) where col2=1 and col3=1 order by +col1; +EXPLAIN SELECT * FROM testable2 force index(PRIMARY) where col2=1 and col3=1 order by +col1; + +DROP TABLE testable2; + --echo End of 5.1 tests === modified file 'sql/sql_select.cc' --- a/sql/sql_select.cc 2009-06-26 19:57:42 +0000 +++ b/sql/sql_select.cc 2009-07-03 10:29:30 +0000 @@ -13144,7 +13144,7 @@ test_if_skip_sort_order(JOIN_TAB *tab,OR temporary table + filesort could be cheaper for grouping queries too. */ - if (is_covering || + if ((ref_key < 0 && is_covering) || select_limit != HA_POS_ERROR || (ref_key < 0 && (group || table->force_index))) { --===============0868652048483391121== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/joro@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: joro@stripped # target_branch: file:///home/kgeorge/mysql/work/B45828-5.1-bugteam/ # testament_sha1: 7676082208ede6989d6e588dd4072172b83b4cc3 # timestamp: 2009-07-03 13:29:35 +0300 # base_revision_id: satya.bn@stripped # # Begin bundle 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 --===============0868652048483391121==--