On 11/02/2012 08:22 AM, Sergei Petrunia wrote: > Hello Igor, > > The fix seems to be ok to push. > > Which version do you want to push it into? This is not a crash, should we > really push it into 5.3, or to 5.5?
The bug was reported for 5.3. So I intend to to push it to 5.3. Both 5.3 and 5.5 are in GA anyway. Regards, Igor. > > On Thu, Nov 01, 2012 at 02:54:34PM -0700, Igor Babaev wrote: >> At file:///home/igor/maria/maria-5.3-mdev585/ >> >> ------------------------------------------------------------ >> revno: 3589 >> revision-id: [email protected] >> parent: [email protected] >> committer: Igor Babaev <[email protected]> >> branch nick: maria-5.3-mdev585 >> timestamp: Thu 2012-11-01 14:54:33 -0700 >> message: >> Fixed bug mdev-585 (LP bug #637962) >> If, when executing a query with ORDER BY col LIMIT n, the optimizer chose >> an index-merge scan to access the table containing col while there existed >> an index defined over col then optimizer did not consider the possibility >> of using an alternative range scan by this index to avoid filesort. This >> could cause a performance degradation if the optimizer flag index_merge was >> set up to 'on'. > >> === modified file 'mysql-test/r/range_vs_index_merge.result' >> --- a/mysql-test/r/range_vs_index_merge.result 2012-03-21 00:03:28 >> +0000 >> +++ b/mysql-test/r/range_vs_index_merge.result 2012-11-01 21:54:33 >> +0000 >> @@ -1221,6 +1221,150 @@ >> Seattle USA 563374 >> Caracas VEN 1975294 >> set optimizer_switch=@save_optimizer_switch; >> +# >> +# Bug mdev-585: range vs index-merge with ORDER BY ... LIMIT n >> +# (LP bug #637962) >> +# >> +DROP INDEX CountryPopulation ON City; >> +DROP INDEX CountryName ON City; >> +DROP INDEX CityName on City; >> +CREATE INDEX Name ON City(Name); >> +CREATE INDEX Population ON City(Population); >> +EXPLAIN >> +SELECT * FROM City >> +WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H')) >> +AND (Population >= 100000 AND Population < 120000); >> +id select_type table type possible_keys key key_len ref >> rows Extra >> +1 SIMPLE City index_merge Country,Name,Population Name,Country >> 35,3 NULL # Using sort_union(Name,Country); Using where >> +FLUSH STATUS; >> +SELECT * FROM City >> +WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H')) >> +AND (Population >= 100000 AND Population < 120000); >> +ID Name Country Population >> +384 Cabo Frio BRA 119503 >> +387 Camaragibe BRA 118968 >> +403 Catanduva BRA 107761 >> +412 Cachoeirinha BRA 103240 >> +508 Watford GBR 113080 >> +509 Ipswich GBR 114000 >> +510 Slough GBR 112000 >> +511 Exeter GBR 111000 >> +512 Cheltenham GBR 106000 >> +513 Gloucester GBR 107000 >> +514 Saint Helens GBR 106293 >> +515 Sutton Coldfield GBR 106001 >> +516 York GBR 104425 >> +517 Oldham GBR 103931 >> +518 Basildon GBR 100924 >> +519 Worthing GBR 100000 >> +635 Mallawi EGY 119283 >> +636 Bilbays EGY 113608 >> +637 Mit Ghamr EGY 101801 >> +638 al-Arish EGY 100447 >> +701 Tarragona ESP 113016 >> +702 Lleida (Lérida) ESP 112207 >> +703 Jaén ESP 109247 >> +704 Ourense (Orense) ESP 109120 >> +705 Mataró ESP 104095 >> +706 Algeciras ESP 103106 >> +707 Marbella ESP 101144 >> +759 Gonder ETH 112249 >> +869 Cabuyao PHL 106630 >> +870 Calapan PHL 105910 >> +873 Cauayan PHL 103952 >> +903 Serekunda GMB 102600 >> +909 Sohumi GEO 111700 >> +913 Tema GHA 109975 >> +914 Sekondi-Takoradi GHA 103653 >> +924 Villa Nueva GTM 101295 >> +1844 Cape Breton CAN 114733 >> +1847 Cambridge CAN 109186 >> +2406 Herakleion GRC 116178 >> +2407 Kallithea GRC 114233 >> +2408 Larisa GRC 113090 >> +2908 Cajamarca PER 108009 >> +3002 Besançon FRA 117733 >> +3003 Caen FRA 113987 >> +3004 Orléans FRA 113126 >> +3005 Mulhouse FRA 110359 >> +3006 Rouen FRA 106592 >> +3007 Boulogne-Billancourt FRA 106367 >> +3008 Perpignan FRA 105115 >> +3009 Nancy FRA 103605 >> +3411 Ceyhan TUR 102412 >> +3567 Carúpano VEN 119639 >> +3568 Catia La Mar VEN 117012 >> +3571 Calabozo VEN 107146 >> +3786 Cam Ranh VNM 114041 >> +3792 Tartu EST 101246 >> +4002 Carrollton USA 109576 >> +4027 Cape Coral USA 102286 >> +4032 Cambridge USA 101355 >> +SHOW STATUS LIKE 'Handler_read_%'; >> +Variable_name Value >> +Handler_read_first 0 >> +Handler_read_key 2 >> +Handler_read_next 385 >> +Handler_read_prev 0 >> +Handler_read_rnd 377 >> +Handler_read_rnd_deleted 0 >> +Handler_read_rnd_next 0 >> +EXPLAIN >> +SELECT * FROM City >> +WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H')) >> +AND (Population >= 100000 AND Population < 120000) >> +ORDER BY Population LIMIT 5; >> +id select_type table type possible_keys key key_len ref >> rows Extra >> +1 SIMPLE City range Country,Name,Population Population 4 >> NULL # Using where >> +FLUSH STATUS; >> +SELECT * FROM City >> +WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H')) >> +AND (Population >= 100000 AND Population < 120000) >> +ORDER BY Population LIMIT 5; >> +ID Name Country Population >> +519 Worthing GBR 100000 >> +638 al-Arish EGY 100447 >> +518 Basildon GBR 100924 >> +707 Marbella ESP 101144 >> +3792 Tartu EST 101246 >> +SHOW STATUS LIKE 'Handler_read_%'; >> +Variable_name Value >> +Handler_read_first 0 >> +Handler_read_key 1 >> +Handler_read_next 59 >> +Handler_read_prev 0 >> +Handler_read_rnd 0 >> +Handler_read_rnd_deleted 0 >> +Handler_read_rnd_next 0 >> +set optimizer_switch='index_merge=off'; >> +EXPLAIN >> +SELECT * FROM City >> +WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H')) >> +AND (Population >= 100000 AND Population < 120000) >> +ORDER BY Population LIMIT 5; >> +id select_type table type possible_keys key key_len ref >> rows Extra >> +1 SIMPLE City range Country,Name,Population Population 4 >> NULL # Using index condition; Using where >> +FLUSH STATUS; >> +SELECT * FROM City >> +WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H')) >> +AND (Population >= 100000 AND Population < 120000) >> +ORDER BY Population LIMIT 5; >> +ID Name Country Population >> +519 Worthing GBR 100000 >> +638 al-Arish EGY 100447 >> +518 Basildon GBR 100924 >> +707 Marbella ESP 101144 >> +3792 Tartu EST 101246 >> +SHOW STATUS LIKE 'Handler_read_%'; >> +Variable_name Value >> +Handler_read_first 0 >> +Handler_read_key 1 >> +Handler_read_next 59 >> +Handler_read_prev 0 >> +Handler_read_rnd 0 >> +Handler_read_rnd_deleted 0 >> +Handler_read_rnd_next 0 >> +set optimizer_switch=@save_optimizer_switch; >> DROP DATABASE world; >> use test; >> CREATE TABLE t1 ( >> >> === modified file 'mysql-test/r/range_vs_index_merge_innodb.result' >> --- a/mysql-test/r/range_vs_index_merge_innodb.result 2012-03-21 >> 00:03:28 +0000 >> +++ b/mysql-test/r/range_vs_index_merge_innodb.result 2012-11-01 >> 21:54:33 +0000 >> @@ -1222,6 +1222,150 @@ >> Seattle USA 563374 >> Caracas VEN 1975294 >> set optimizer_switch=@save_optimizer_switch; >> +# >> +# Bug mdev-585: range vs index-merge with ORDER BY ... LIMIT n >> +# (LP bug #637962) >> +# >> +DROP INDEX CountryPopulation ON City; >> +DROP INDEX CountryName ON City; >> +DROP INDEX CityName on City; >> +CREATE INDEX Name ON City(Name); >> +CREATE INDEX Population ON City(Population); >> +EXPLAIN >> +SELECT * FROM City >> +WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H')) >> +AND (Population >= 100000 AND Population < 120000); >> +id select_type table type possible_keys key key_len ref >> rows Extra >> +1 SIMPLE City index_merge Country,Name,Population Name,Country >> 35,3 NULL # Using sort_union(Name,Country); Using where >> +FLUSH STATUS; >> +SELECT * FROM City >> +WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H')) >> +AND (Population >= 100000 AND Population < 120000); >> +ID Name Country Population >> +384 Cabo Frio BRA 119503 >> +387 Camaragibe BRA 118968 >> +403 Catanduva BRA 107761 >> +412 Cachoeirinha BRA 103240 >> +508 Watford GBR 113080 >> +509 Ipswich GBR 114000 >> +510 Slough GBR 112000 >> +511 Exeter GBR 111000 >> +512 Cheltenham GBR 106000 >> +513 Gloucester GBR 107000 >> +514 Saint Helens GBR 106293 >> +515 Sutton Coldfield GBR 106001 >> +516 York GBR 104425 >> +517 Oldham GBR 103931 >> +518 Basildon GBR 100924 >> +519 Worthing GBR 100000 >> +635 Mallawi EGY 119283 >> +636 Bilbays EGY 113608 >> +637 Mit Ghamr EGY 101801 >> +638 al-Arish EGY 100447 >> +701 Tarragona ESP 113016 >> +702 Lleida (Lérida) ESP 112207 >> +703 Jaén ESP 109247 >> +704 Ourense (Orense) ESP 109120 >> +705 Mataró ESP 104095 >> +706 Algeciras ESP 103106 >> +707 Marbella ESP 101144 >> +759 Gonder ETH 112249 >> +869 Cabuyao PHL 106630 >> +870 Calapan PHL 105910 >> +873 Cauayan PHL 103952 >> +903 Serekunda GMB 102600 >> +909 Sohumi GEO 111700 >> +913 Tema GHA 109975 >> +914 Sekondi-Takoradi GHA 103653 >> +924 Villa Nueva GTM 101295 >> +1844 Cape Breton CAN 114733 >> +1847 Cambridge CAN 109186 >> +2406 Herakleion GRC 116178 >> +2407 Kallithea GRC 114233 >> +2408 Larisa GRC 113090 >> +2908 Cajamarca PER 108009 >> +3002 Besançon FRA 117733 >> +3003 Caen FRA 113987 >> +3004 Orléans FRA 113126 >> +3005 Mulhouse FRA 110359 >> +3006 Rouen FRA 106592 >> +3007 Boulogne-Billancourt FRA 106367 >> +3008 Perpignan FRA 105115 >> +3009 Nancy FRA 103605 >> +3411 Ceyhan TUR 102412 >> +3567 Carúpano VEN 119639 >> +3568 Catia La Mar VEN 117012 >> +3571 Calabozo VEN 107146 >> +3786 Cam Ranh VNM 114041 >> +3792 Tartu EST 101246 >> +4002 Carrollton USA 109576 >> +4027 Cape Coral USA 102286 >> +4032 Cambridge USA 101355 >> +SHOW STATUS LIKE 'Handler_read_%'; >> +Variable_name Value >> +Handler_read_first 0 >> +Handler_read_key 2 >> +Handler_read_next 385 >> +Handler_read_prev 0 >> +Handler_read_rnd 377 >> +Handler_read_rnd_deleted 0 >> +Handler_read_rnd_next 0 >> +EXPLAIN >> +SELECT * FROM City >> +WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H')) >> +AND (Population >= 100000 AND Population < 120000) >> +ORDER BY Population LIMIT 5; >> +id select_type table type possible_keys key key_len ref >> rows Extra >> +1 SIMPLE City range Country,Name,Population Population 4 >> NULL # Using where >> +FLUSH STATUS; >> +SELECT * FROM City >> +WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H')) >> +AND (Population >= 100000 AND Population < 120000) >> +ORDER BY Population LIMIT 5; >> +ID Name Country Population >> +519 Worthing GBR 100000 >> +638 al-Arish EGY 100447 >> +518 Basildon GBR 100924 >> +707 Marbella ESP 101144 >> +3792 Tartu EST 101246 >> +SHOW STATUS LIKE 'Handler_read_%'; >> +Variable_name Value >> +Handler_read_first 0 >> +Handler_read_key 1 >> +Handler_read_next 59 >> +Handler_read_prev 0 >> +Handler_read_rnd 0 >> +Handler_read_rnd_deleted 0 >> +Handler_read_rnd_next 0 >> +set optimizer_switch='index_merge=off'; >> +EXPLAIN >> +SELECT * FROM City >> +WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H')) >> +AND (Population >= 100000 AND Population < 120000) >> +ORDER BY Population LIMIT 5; >> +id select_type table type possible_keys key key_len ref >> rows Extra >> +1 SIMPLE City range Country,Name,Population Population 4 >> NULL # Using index condition; Using where >> +FLUSH STATUS; >> +SELECT * FROM City >> +WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H')) >> +AND (Population >= 100000 AND Population < 120000) >> +ORDER BY Population LIMIT 5; >> +ID Name Country Population >> +519 Worthing GBR 100000 >> +638 al-Arish EGY 100447 >> +518 Basildon GBR 100924 >> +707 Marbella ESP 101144 >> +3792 Tartu EST 101246 >> +SHOW STATUS LIKE 'Handler_read_%'; >> +Variable_name Value >> +Handler_read_first 0 >> +Handler_read_key 1 >> +Handler_read_next 59 >> +Handler_read_prev 0 >> +Handler_read_rnd 0 >> +Handler_read_rnd_deleted 0 >> +Handler_read_rnd_next 0 >> +set optimizer_switch=@save_optimizer_switch; >> DROP DATABASE world; >> use test; >> CREATE TABLE t1 ( >> >> === modified file 'mysql-test/t/range_vs_index_merge.test' >> --- a/mysql-test/t/range_vs_index_merge.test 2012-03-21 00:03:28 +0000 >> +++ b/mysql-test/t/range_vs_index_merge.test 2012-11-01 21:54:33 +0000 >> @@ -675,6 +675,64 @@ >> $cond; >> >> set optimizer_switch=@save_optimizer_switch; >> + >> +--echo # >> +--echo # Bug mdev-585: range vs index-merge with ORDER BY ... LIMIT n >> +--echo # (LP bug #637962) >> +--echo # >> + >> +DROP INDEX CountryPopulation ON City; >> +DROP INDEX CountryName ON City; >> +DROP INDEX CityName on City; >> + >> +CREATE INDEX Name ON City(Name); >> +CREATE INDEX Population ON City(Population); >> + >> + >> +--replace_column 9 # >> +EXPLAIN >> +SELECT * FROM City >> + WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H')) >> + AND (Population >= 100000 AND Population < 120000); >> +FLUSH STATUS; >> +SELECT * FROM City >> + WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H')) >> + AND (Population >= 100000 AND Population < 120000); >> +SHOW STATUS LIKE 'Handler_read_%'; >> + >> + >> +--replace_column 9 # >> +EXPLAIN >> +SELECT * FROM City >> + WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H')) >> + AND (Population >= 100000 AND Population < 120000) >> +ORDER BY Population LIMIT 5; >> + >> +FLUSH STATUS; >> +SELECT * FROM City >> + WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H')) >> + AND (Population >= 100000 AND Population < 120000) >> +ORDER BY Population LIMIT 5; >> +SHOW STATUS LIKE 'Handler_read_%'; >> + >> + >> +set optimizer_switch='index_merge=off'; >> + >> +--replace_column 9 # >> +EXPLAIN >> +SELECT * FROM City >> + WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H')) >> + AND (Population >= 100000 AND Population < 120000) >> +ORDER BY Population LIMIT 5; >> + >> +FLUSH STATUS; >> +SELECT * FROM City >> + WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'H')) >> + AND (Population >= 100000 AND Population < 120000) >> +ORDER BY Population LIMIT 5; >> +SHOW STATUS LIKE 'Handler_read_%'; >> + >> +set optimizer_switch=@save_optimizer_switch; >> >> >> DROP DATABASE world; >> >> === modified file 'sql/sql_select.cc' >> --- a/sql/sql_select.cc 2012-10-10 05:21:22 +0000 >> +++ b/sql/sql_select.cc 2012-11-01 21:54:33 +0000 >> @@ -18079,15 +18079,18 @@ >> */ >> >> if (quick_type == QUICK_SELECT_I::QS_TYPE_INDEX_MERGE || >> - quick_type == QUICK_SELECT_I::QS_TYPE_INDEX_INTERSECT || >> + quick_type == QUICK_SELECT_I::QS_TYPE_INDEX_INTERSECT || >> quick_type == QUICK_SELECT_I::QS_TYPE_ROR_UNION || >> quick_type == QUICK_SELECT_I::QS_TYPE_ROR_INTERSECT) >> - goto use_filesort; >> - ref_key= select->quick->index; >> - ref_key_parts= select->quick->used_key_parts; >> + ref_key= MAX_KEY; >> + else >> + { >> + ref_key= select->quick->index; >> + ref_key_parts= select->quick->used_key_parts; >> + } >> } >> >> - if (ref_key >= 0) >> + if (ref_key >= 0 && ref_key != MAX_KEY) >> { >> /* >> We come here when there is a REF key. >> @@ -18229,7 +18232,8 @@ >> else >> keys= usable_keys; >> >> - if (ref_key >= 0 && table->covering_keys.is_set(ref_key)) >> + if (ref_key >= 0 && ref_key != MAX_KEY && >> + table->covering_keys.is_set(ref_key)) >> ref_key_quick_rows= table->quick_rows[ref_key]; >> >> read_time= join->best_positions[tablenr].read_time; >> > >> _______________________________________________ >> commits mailing list >> [email protected] >> https://lists.askmonty.org/cgi-bin/mailman/listinfo/commits > _______________________________________________ Mailing list: https://launchpad.net/~maria-developers Post to : [email protected] Unsubscribe : https://launchpad.net/~maria-developers More help : https://help.launchpad.net/ListHelp

