mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Bug #38745: MySQL 5.1 optimizer uses filesort for ORDER BY
when it should use index Sometimes the LEFT/RIGHT JOIN with an empty table caused an unnecessary filesort. Sample query, where t1.i1 is indexed and t3 is empty: SELECT t1.*, t2.* FROM t1 JOIN t2 ON t1.i1 = t2.i2 LEFT JOIN t3 ON t2.i2 = t3.i3 ORDER BY t1.i1 LIMIT 5; The server erroneously used an item of empty outer-joined table as a common constant of a Item_equal (multi-equivalence expression). By the fix for the bug 16590 the constant status of such an item has been propagated to st_table::const_key_parts map bits related to other Item_equal argument-related key parts (those are obviously not constant in our case). As far as test_if_skip_sort_order function skips constant prefixes of testing keys, this caused an ignorance of available indices, since some prefixes were marked as constant by mistake. mysql-test/r/order_by.result: Test case for bug #38745. mysql-test/t/order_by.test: Test case for bug #38745. sql/item.h: Bug #38745: MySQL 5.1 optimizer uses filesort for ORDER BY when it should use index Item::is_outer_field() has been added and overloaded for Item_field and Item_ref classes. sql/item_cmpfunc.cc: Bug #38745: MySQL 5.1 optimizer uses filesort for ORDER BY when it should use index Item_equal::update_const() and Item_equal::update_used_tables() have been updated to not take into account the constantness of outer-joined table items.
This commit is contained in:
@ -1468,3 +1468,27 @@ SELECT * FROM t1 FORCE INDEX FOR JOIN (a), t2 WHERE t1.a < 2 ORDER BY t1.a;
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Bug #38745: MySQL 5.1 optimizer uses filesort for ORDER BY
|
||||
--echo # when it should use index
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (i1 integer NOT NULL PRIMARY KEY);
|
||||
CREATE TABLE t2 (i2 integer NOT NULL PRIMARY KEY);
|
||||
CREATE TABLE t3 (i3 integer);
|
||||
|
||||
INSERT INTO t1 VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12);
|
||||
INSERT INTO t2 SELECT * FROM t1;
|
||||
|
||||
EXPLAIN EXTENDED
|
||||
SELECT t1.*, t2.* FROM t1 JOIN t2 ON t1.i1 = t2.i2
|
||||
LEFT JOIN t3 ON t2.i2 = t3.i3
|
||||
ORDER BY t1.i1 LIMIT 5;
|
||||
|
||||
SELECT t1.*, t2.* FROM t1 JOIN t2 ON t1.i1 = t2.i2
|
||||
LEFT JOIN t3 ON t2.i2 = t3.i3
|
||||
ORDER BY t1.i1 LIMIT 5;
|
||||
|
||||
DROP TABLE t1, t2, t3;
|
||||
|
Reference in New Issue
Block a user