From: Georgi Kodinov Date: July 7 2009 12:52pm Subject: bzr commit into mysql-5.1-bugteam branch (joro:2990) Bug#36259 Bug#45828 List-Archive: http://lists.mysql.com/commits/78124 X-Bug: 36259,45828 Message-Id: <200907071252.n67CqekQ008409@magare.gmz> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============6192694534994513236==" --===============6192694534994513236== 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-07 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-07 12:52:34 +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-07 12:52:34 +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,75 @@ 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 t1 ( +a INT NOT NULL AUTO_INCREMENT, +b INT NOT NULL, +c INT NOT NULL, +d VARCHAR(5), +e INT NOT NULL, +PRIMARY KEY (a), KEY i2 (b,c,d) +) ENGINE=InnoDB; +INSERT INTO t1 (b,c,d,e) VALUES (1,1,'a',1), (2,2,'b',2); +INSERT INTO t1 (b,c,d,e) SELECT RAND()*10000, RAND()*10000, d, e FROM t1; +INSERT INTO t1 (b,c,d,e) SELECT RAND()*10000, RAND()*10000, d, e FROM t1; +INSERT INTO t1 (b,c,d,e) SELECT RAND()*10000, RAND()*10000, d, e FROM t1; +INSERT INTO t1 (b,c,d,e) SELECT RAND()*10000, RAND()*10000, d, e FROM t1; +INSERT INTO t1 (b,c,d,e) SELECT RAND()*10000, RAND()*10000, d, e FROM t1; +INSERT INTO t1 (b,c,d,e) SELECT RAND()*10000, RAND()*10000, d, e FROM t1; +EXPLAIN SELECT * FROM t1 WHERE b=1 AND c=1 ORDER BY a; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref i2 i2 8 const,const 1 Using where; Using filesort +EXPLAIN SELECT * FROM t1 FORCE INDEX(i2) WHERE b=1 and c=1 ORDER BY a; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref i2 i2 8 const,const 1 Using where; Using filesort +EXPLAIN SELECT * FROM t1 FORCE INDEX(PRIMARY) WHERE b=1 AND c=1 ORDER BY a; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index NULL PRIMARY 4 NULL 128 Using where +DROP TABLE t1; 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-07 12:52:34 +0000 @@ -380,4 +380,85 @@ 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 t1 ( + a INT NOT NULL AUTO_INCREMENT, + b INT NOT NULL, + c INT NOT NULL, + d VARCHAR(5), + e INT NOT NULL, + PRIMARY KEY (a), KEY i2 (b,c,d) +) ENGINE=InnoDB; + +INSERT INTO t1 (b,c,d,e) VALUES (1,1,'a',1), (2,2,'b',2); +INSERT INTO t1 (b,c,d,e) SELECT RAND()*10000, RAND()*10000, d, e FROM t1; +INSERT INTO t1 (b,c,d,e) SELECT RAND()*10000, RAND()*10000, d, e FROM t1; +INSERT INTO t1 (b,c,d,e) SELECT RAND()*10000, RAND()*10000, d, e FROM t1; +INSERT INTO t1 (b,c,d,e) SELECT RAND()*10000, RAND()*10000, d, e FROM t1; +INSERT INTO t1 (b,c,d,e) SELECT RAND()*10000, RAND()*10000, d, e FROM t1; +INSERT INTO t1 (b,c,d,e) SELECT RAND()*10000, RAND()*10000, d, e FROM t1; +EXPLAIN SELECT * FROM t1 WHERE b=1 AND c=1 ORDER BY a; +EXPLAIN SELECT * FROM t1 FORCE INDEX(i2) WHERE b=1 and c=1 ORDER BY a; +EXPLAIN SELECT * FROM t1 FORCE INDEX(PRIMARY) WHERE b=1 AND c=1 ORDER BY a; + +DROP TABLE t1; + --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-07 12:52:34 +0000 @@ -13128,9 +13128,17 @@ 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 (where "ordering key" is a key that will return rows + in the order required by ORDER BY). + */ + 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 +13219,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) { --===============6192694534994513236== 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: 8681acdeb0cb581d69fa4bb27cb43adf396f49f3 # timestamp: 2009-07-07 15:52:40 +0300 # base_revision_id: satya.bn@stripped # # Begin bundle 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 hvLHXRx6nTLjNkF3JFOFCQ2TxVHQ --===============6192694534994513236==--