From: Georgi Kodinov Date: July 6 2009 2:55pm Subject: bzr commit into mysql-5.1-bugteam branch (joro:2990) Bug#36259 Bug#45828 List-Archive: http://lists.mysql.com/commits/78030 X-Bug: 36259,45828 Message-Id: <200907061455.n66Etk1U001424@magare.gmz> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1170105558641544986==" --===============1170105558641544986== 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-06 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 ordering indexes to be preferred unconditionally over non-covering and ref indexes. Fixed by comparing the cost of using a covering index to the cost of using a ref index even for covering ordering indexes. Added an assertion to clarify the condition the local variables should be in. @ 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-06 14:55:41 +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-06 14:55:41 +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-06 14:55:41 +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-06 14:55:41 +0000 @@ -13128,9 +13128,13 @@ test_if_skip_sort_order(JOIN_TAB *tab,OR for (nr=0; nr < table->s->keys ; nr++) { int direction; + if (keys.is_set(nr) && (direction= test_if_order_by_key(order, table, nr, &used_key_parts))) { + /* At this point we are sure that ref_key is a ?non-ordering? key. */ + DBUG_ASSERT (ref_key != (int) nr); + bool is_covering= table->covering_keys.is_set(nr) || (nr == table->s->primary_key && table->file->primary_key_is_clustered()); @@ -13211,7 +13215,7 @@ test_if_skip_sort_order(JOIN_TAB *tab,OR */ index_scan_time= select_limit/rec_per_key * min(rec_per_key, table->file->scan_time()); - if (is_covering || + if ((ref_key < 0 && is_covering) || (ref_key < 0 && (group || table->force_index)) || index_scan_time < read_time) { --===============1170105558641544986== 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: 7fbf5f8ef80b7c68f55869522d73848acdc1fb2f # timestamp: 2009-07-06 17:55:46 +0300 # base_revision_id: satya.bn@stripped # # Begin bundle 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 --===============1170105558641544986==--