MWL #21: "index_merge: non-ROR intersection".

The second (final) patch.
This commit is contained in:
Igor Babaev 2010-12-01 23:39:39 -08:00
parent 7970b3346a
commit 80377bbf6d
27 changed files with 3237 additions and 505 deletions

View File

@ -539,7 +539,7 @@ INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
SET SESSION sort_buffer_size=1;
SET SESSION sort_buffer_size=1024*8;
EXPLAIN
SELECT * FROM t1 FORCE INDEX(a,b) WHERE a LIKE 'a%' OR b LIKE 'b%'
ORDER BY a,b;

View File

@ -0,0 +1,921 @@
DROP TABLE IF EXISTS t1,t2,t3,t4;
DROP DATABASE IF EXISTS world;
set names utf8;
CREATE DATABASE world;
use world;
CREATE TABLE Country (
Code char(3) NOT NULL default '',
Name char(52) NOT NULL default '',
SurfaceArea float(10,2) NOT NULL default '0.00',
Population int(11) NOT NULL default '0',
Capital int(11) default NULL,
PRIMARY KEY (Code),
UNIQUE INDEX (Name)
);
CREATE TABLE City (
ID int(11) NOT NULL auto_increment,
Name char(35) NOT NULL default '',
Country char(3) NOT NULL default '',
Population int(11) NOT NULL default '0',
PRIMARY KEY (ID),
INDEX (Population),
INDEX (Country)
);
CREATE TABLE CountryLanguage (
Country char(3) NOT NULL default '',
Language char(30) NOT NULL default '',
Percentage float(3,1) NOT NULL default '0.0',
PRIMARY KEY (Country, Language),
INDEX (Percentage)
);
SELECT COUNT(*) FROM Country;
COUNT(*)
239
SELECT COUNT(*) FROM City;
COUNT(*)
4079
SELECT COUNT(*) FROM CountryLanguage;
COUNT(*)
984
CREATE INDEX Name ON City(Name);
SET SESSION optimizer_switch='index_merge_sort_intersection=on';
SELECT COUNT(*) FROM City;
COUNT(*)
4079
SELECT COUNT(*) FROM City WHERE Name LIKE 'C%';
COUNT(*)
281
SELECT COUNT(*) FROM City WHERE Name LIKE 'M%';
COUNT(*)
301
SELECT COUNT(*) FROM City WHERE Population > 1000000;
COUNT(*)
237
SELECT COUNT(*) FROM City WHERE Population > 500000;
COUNT(*)
539
SELECT COUNT(*) FROM City WHERE Population > 300000;
COUNT(*)
1062
SELECT COUNT(*) FROM City WHERE Population > 5000000;
COUNT(*)
24
EXPLAIN
SELECT * FROM City WHERE
Name LIKE 'C%' AND Population > 1000000;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,Name Population,Name 4,35 NULL 9 Using sort_intersect(Population,Name); Using where
EXPLAIN
SELECT * FROM City WHERE
Name LIKE 'M%' AND Population > 500000;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,Name Population,Name 4,35 NULL 21 Using sort_intersect(Population,Name); Using where
EXPLAIN
SELECT * FROM City
WHERE Name LIKE 'M%' AND Population > 300000;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,Name Name 35 NULL 164 Using where
EXPLAIN
SELECT * FROM City
WHERE Name LIKE 'M%' AND Population > 5000000;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,Name Population 4 NULL 25 Using where
SELECT * FROM City USE INDEX ()
WHERE Name LIKE 'C%' AND Population > 1000000;
ID Name Country Population
71 Córdoba ARG 1157507
151 Chittagong BGD 1392860
212 Curitiba BRA 1584232
608 Cairo EGY 6789479
712 Cape Town ZAF 2352121
926 Conakry GIN 1090610
1026 Calcutta [Kolkata] IND 4399819
1027 Chennai (Madras) IND 3841396
1892 Chongqing CHN 6351600
1898 Chengdu CHN 3361500
1900 Changchun CHN 2812000
1910 Changsha CHN 1809800
2258 Cali COL 2077386
2485 Casablanca MAR 2940623
2515 Ciudad de México MEX 8591309
3539 Caracas VEN 1975294
3795 Chicago USA 2896016
SELECT * FROM City
WHERE Name LIKE 'C%' AND Population > 1000000;
ID Name Country Population
71 Córdoba ARG 1157507
151 Chittagong BGD 1392860
212 Curitiba BRA 1584232
608 Cairo EGY 6789479
712 Cape Town ZAF 2352121
926 Conakry GIN 1090610
1026 Calcutta [Kolkata] IND 4399819
1027 Chennai (Madras) IND 3841396
1892 Chongqing CHN 6351600
1898 Chengdu CHN 3361500
1900 Changchun CHN 2812000
1910 Changsha CHN 1809800
2258 Cali COL 2077386
2485 Casablanca MAR 2940623
2515 Ciudad de México MEX 8591309
3539 Caracas VEN 1975294
3795 Chicago USA 2896016
SELECT * FROM City USE INDEX ()
WHERE Name LIKE 'M%' AND Population > 500000;
ID Name Country Population
77 Mar del Plata ARG 512880
131 Melbourne AUS 2865329
215 Manaus BRA 1255049
223 Maceió BRA 786288
653 Madrid ESP 2879052
658 Málaga ESP 530553
766 Manila PHL 1581082
942 Medan IDN 1843919
947 Malang IDN 716862
1024 Mumbai (Bombay) IND 10500000
1042 Madurai IND 977856
1051 Meerut IND 753778
1366 Mosul IRQ 879000
1381 Mashhad IRN 1887405
1465 Milano ITA 1300977
1810 Montréal CAN 1016376
1816 Mississauga CAN 608072
1945 Mudanjiang CHN 570000
2259 Medellín COL 1861265
2300 Mbuji-Mayi COD 806475
2440 Monrovia LBR 850000
2487 Marrakech MAR 621914
2523 Monterrey MEX 1108499
2526 Mexicali MEX 764902
2530 Mérida MEX 703324
2537 Morelia MEX 619958
2698 Maputo MOZ 1018938
2711 Mandalay MMR 885300
2734 Managua NIC 959000
2826 Multan PAK 1182441
2975 Marseille FRA 798430
3070 Munich [München] DEU 1194560
3175 Mekka SAU 965700
3176 Medina SAU 608300
3214 Mogadishu SOM 997000
3364 Mersin (Içel) TUR 587212
3434 Mykolajiv UKR 508000
3492 Montevideo URY 1236000
3520 Minsk BLR 1674000
3540 Maracaíbo VEN 1304776
3580 Moscow RUS 8389200
3810 Memphis USA 650100
3811 Milwaukee USA 596974
SELECT * FROM City
WHERE Name LIKE 'M%' AND Population > 500000;
ID Name Country Population
77 Mar del Plata ARG 512880
131 Melbourne AUS 2865329
215 Manaus BRA 1255049
223 Maceió BRA 786288
653 Madrid ESP 2879052
658 Málaga ESP 530553
766 Manila PHL 1581082
942 Medan IDN 1843919
947 Malang IDN 716862
1024 Mumbai (Bombay) IND 10500000
1042 Madurai IND 977856
1051 Meerut IND 753778
1366 Mosul IRQ 879000
1381 Mashhad IRN 1887405
1465 Milano ITA 1300977
1810 Montréal CAN 1016376
1816 Mississauga CAN 608072
1945 Mudanjiang CHN 570000
2259 Medellín COL 1861265
2300 Mbuji-Mayi COD 806475
2440 Monrovia LBR 850000
2487 Marrakech MAR 621914
2523 Monterrey MEX 1108499
2526 Mexicali MEX 764902
2530 Mérida MEX 703324
2537 Morelia MEX 619958
2698 Maputo MOZ 1018938
2711 Mandalay MMR 885300
2734 Managua NIC 959000
2826 Multan PAK 1182441
2975 Marseille FRA 798430
3070 Munich [München] DEU 1194560
3175 Mekka SAU 965700
3176 Medina SAU 608300
3214 Mogadishu SOM 997000
3364 Mersin (Içel) TUR 587212
3434 Mykolajiv UKR 508000
3492 Montevideo URY 1236000
3520 Minsk BLR 1674000
3540 Maracaíbo VEN 1304776
3580 Moscow RUS 8389200
3810 Memphis USA 650100
3811 Milwaukee USA 596974
SELECT * FROM City USE INDEX ()
WHERE Name LIKE 'M%' AND Population > 300000;
ID Name Country Population
77 Mar del Plata ARG 512880
80 Merlo ARG 463846
83 Moreno ARG 356993
87 Morón ARG 349246
131 Melbourne AUS 2865329
215 Manaus BRA 1255049
223 Maceió BRA 786288
250 Mauá BRA 375055
256 Moji das Cruzes BRA 339194
462 Manchester GBR 430000
653 Madrid ESP 2879052
658 Málaga ESP 530553
661 Murcia ESP 353504
766 Manila PHL 1581082
778 Makati PHL 444867
781 Marikina PHL 391170
783 Muntinlupa PHL 379310
786 Malabon PHL 338855
942 Medan IDN 1843919
947 Malang IDN 716862
962 Manado IDN 332288
963 Mataram IDN 306600
1024 Mumbai (Bombay) IND 10500000
1042 Madurai IND 977856
1051 Meerut IND 753778
1074 Mysore IND 480692
1081 Moradabad IND 429214
1098 Malegaon IND 342595
1366 Mosul IRQ 879000
1381 Mashhad IRN 1887405
1465 Milano ITA 1300977
1559 Matsuyama JPN 466133
1560 Matsudo JPN 461126
1578 Machida JPN 364197
1595 Miyazaki JPN 303784
1810 Montréal CAN 1016376
1816 Mississauga CAN 608072
1882 Mombasa KEN 461753
1945 Mudanjiang CHN 570000
2005 Ma´anshan CHN 305421
2259 Medellín COL 1861265
2267 Manizales COL 337580
2300 Mbuji-Mayi COD 806475
2348 Masan KOR 441242
2440 Monrovia LBR 850000
2454 Macao MAC 437500
2487 Marrakech MAR 621914
2491 Meknès MAR 460000
2523 Monterrey MEX 1108499
2526 Mexicali MEX 764902
2530 Mérida MEX 703324
2537 Morelia MEX 619958
2554 Matamoros MEX 416428
2557 Mazatlán MEX 380265
2698 Maputo MOZ 1018938
2699 Matola MOZ 424662
2711 Mandalay MMR 885300
2712 Moulmein (Mawlamyine) MMR 307900
2734 Managua NIC 959000
2756 Mushin NGA 333200
2757 Maiduguri NGA 320000
2826 Multan PAK 1182441
2975 Marseille FRA 798430
3070 Munich [München] DEU 1194560
3086 Mannheim DEU 307730
3175 Mekka SAU 965700
3176 Medina SAU 608300
3214 Mogadishu SOM 997000
3364 Mersin (Içel) TUR 587212
3371 Malatya TUR 330312
3434 Mykolajiv UKR 508000
3435 Mariupol UKR 490000
3438 Makijivka UKR 384000
3492 Montevideo URY 1236000
3520 Minsk BLR 1674000
3522 Mogiljov BLR 356000
3540 Maracaíbo VEN 1304776
3545 Maracay VEN 444443
3547 Maturín VEN 319726
3580 Moscow RUS 8389200
3622 Magnitogorsk RUS 427900
3625 Murmansk RUS 376300
3636 Mahat?kala RUS 332800
3810 Memphis USA 650100
3811 Milwaukee USA 596974
3834 Mesa USA 396375
3837 Minneapolis USA 382618
3839 Miami USA 362470
SELECT * FROM City
WHERE Name LIKE 'M%' AND Population > 300000;
ID Name Country Population
2454 Macao MAC 437500
223 Maceió BRA 786288
1578 Machida JPN 364197
653 Madrid ESP 2879052
1042 Madurai IND 977856
3622 Magnitogorsk RUS 427900
3636 Mahat?kala RUS 332800
2757 Maiduguri NGA 320000
778 Makati PHL 444867
3438 Makijivka UKR 384000
786 Malabon PHL 338855
658 Málaga ESP 530553
947 Malang IDN 716862
3371 Malatya TUR 330312
1098 Malegaon IND 342595
962 Manado IDN 332288
2734 Managua NIC 959000
215 Manaus BRA 1255049
462 Manchester GBR 430000
2711 Mandalay MMR 885300
766 Manila PHL 1581082
2267 Manizales COL 337580
3086 Mannheim DEU 307730
2698 Maputo MOZ 1018938
77 Mar del Plata ARG 512880
3540 Maracaíbo VEN 1304776
3545 Maracay VEN 444443
781 Marikina PHL 391170
3435 Mariupol UKR 490000
2487 Marrakech MAR 621914
2975 Marseille FRA 798430
2348 Masan KOR 441242
1381 Mashhad IRN 1887405
2554 Matamoros MEX 416428
963 Mataram IDN 306600
2699 Matola MOZ 424662
1560 Matsudo JPN 461126
1559 Matsuyama JPN 466133
3547 Maturín VEN 319726
250 Mauá BRA 375055
2557 Mazatlán MEX 380265
2005 Ma´anshan CHN 305421
2300 Mbuji-Mayi COD 806475
942 Medan IDN 1843919
2259 Medellín COL 1861265
3176 Medina SAU 608300
1051 Meerut IND 753778
3175 Mekka SAU 965700
2491 Meknès MAR 460000
131 Melbourne AUS 2865329
3810 Memphis USA 650100
2530 Mérida MEX 703324
80 Merlo ARG 463846
3364 Mersin (Içel) TUR 587212
3834 Mesa USA 396375
2526 Mexicali MEX 764902
3839 Miami USA 362470
1465 Milano ITA 1300977
3811 Milwaukee USA 596974
3837 Minneapolis USA 382618
3520 Minsk BLR 1674000
1816 Mississauga CAN 608072
1595 Miyazaki JPN 303784
3214 Mogadishu SOM 997000
3522 Mogiljov BLR 356000
256 Moji das Cruzes BRA 339194
1882 Mombasa KEN 461753
2440 Monrovia LBR 850000
2523 Monterrey MEX 1108499
3492 Montevideo URY 1236000
1810 Montréal CAN 1016376
1081 Moradabad IND 429214
2537 Morelia MEX 619958
83 Moreno ARG 356993
87 Morón ARG 349246
3580 Moscow RUS 8389200
1366 Mosul IRQ 879000
2712 Moulmein (Mawlamyine) MMR 307900
1945 Mudanjiang CHN 570000
2826 Multan PAK 1182441
1024 Mumbai (Bombay) IND 10500000
3070 Munich [München] DEU 1194560
783 Muntinlupa PHL 379310
661 Murcia ESP 353504
3625 Murmansk RUS 376300
2756 Mushin NGA 333200
3434 Mykolajiv UKR 508000
1074 Mysore IND 480692
SELECT * FROM City USE INDEX ()
WHERE Name LIKE 'M%' AND Population > 5000000;
ID Name Country Population
1024 Mumbai (Bombay) IND 10500000
3580 Moscow RUS 8389200
SELECT * FROM City
WHERE Name LIKE 'M%' AND Population > 5000000;
ID Name Country Population
3580 Moscow RUS 8389200
1024 Mumbai (Bombay) IND 10500000
SELECT COUNT(*) FROM City WHERE Name BETWEEN 'M' AND 'N';
COUNT(*)
301
SELECT COUNT(*) FROM City WHERE Name BETWEEN 'G' AND 'J';
COUNT(*)
408
SELECT COUNT(*) FROM City WHERE Population > 1000000;
COUNT(*)
237
SELECT COUNT(*) FROM City WHERE Population > 700000;
COUNT(*)
358
SELECT COUNT(*) FROM City WHERE Population > 500000;
COUNT(*)
539
SELECT COUNT(*) FROM City WHERE Country LIKE 'C%';
COUNT(*)
551
SELECT COUNT(*) FROM City WHERE Country LIKE 'L%';
COUNT(*)
29
EXPLAIN
SELECT * FROM City
WHERE Name BETWEEN 'M' AND 'N' AND Population > 1000000 AND Country LIKE 'C%';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,Country,Name Population,Name 4,35 NULL 9 Using sort_intersect(Population,Name); Using where
EXPLAIN
SELECT * FROM City
WHERE Name BETWEEN 'G' AND 'J' AND Population > 700000 AND Country LIKE 'L%';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,Country,Name Country 3 NULL 28 Using where
EXPLAIN
SELECT * FROM City
WHERE Name BETWEEN 'G' AND 'J' AND Population > 500000 AND Country LIKE 'C%';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,Country,Name Country,Name 3,35 NULL 29 Using sort_intersect(Country,Name); Using where
SELECT * FROM City USE INDEX ()
WHERE Name BETWEEN 'M' AND 'N' AND Population > 1000000 AND Country LIKE 'C%';
ID Name Country Population
1810 Montréal CAN 1016376
2259 Medellín COL 1861265
SELECT * FROM City
WHERE Name BETWEEN 'M' AND 'N' AND Population > 1000000 AND Country LIKE 'C%';
ID Name Country Population
1810 Montréal CAN 1016376
2259 Medellín COL 1861265
SELECT * FROM City USE INDEX ()
WHERE Name BETWEEN 'G' AND 'J' AND Population > 700000 AND Country LIKE 'M%';
ID Name Country Population
2516 Guadalajara MEX 1647720
SELECT * FROM City
WHERE Name BETWEEN 'G' AND 'J' AND Population > 700000 AND Country LIKE 'M%';
ID Name Country Population
2516 Guadalajara MEX 1647720
SELECT * FROM City USE INDEX ()
WHERE Name BETWEEN 'G' AND 'J' AND Population > 500000 AND Country LIKE 'C%';
ID Name Country Population
1895 Harbin CHN 4289800
1905 Hangzhou CHN 2190500
1914 Guiyang CHN 1465200
1916 Hefei CHN 1369100
1927 Hohhot CHN 916700
1928 Handan CHN 840000
1937 Huainan CHN 700000
1950 Hegang CHN 520000
SELECT * FROM City
WHERE Name BETWEEN 'G' AND 'J' AND Population > 500000 AND Country LIKE 'C%';
ID Name Country Population
1895 Harbin CHN 4289800
1905 Hangzhou CHN 2190500
1914 Guiyang CHN 1465200
1916 Hefei CHN 1369100
1927 Hohhot CHN 916700
1928 Handan CHN 840000
1937 Huainan CHN 700000
1950 Hegang CHN 520000
SELECT COUNT(*) FROM City WHERE ID BETWEEN 500 AND 999;
COUNT(*)
500
SELECT COUNT(*) FROM City WHERE ID BETWEEN 3500 AND 3999;
COUNT(*)
500
SELECT COUNT(*) FROM City WHERE ID BETWEEN 1 AND 1000;
COUNT(*)
1000
SELECT COUNT(*) FROM City WHERE Population > 700000;
COUNT(*)
358
SELECT COUNT(*) FROM City WHERE Population > 1000000;
COUNT(*)
237
SELECT COUNT(*) FROM City WHERE Population > 300000;
COUNT(*)
1062
SELECT COUNT(*) FROM City WHERE Country LIKE 'C%';
COUNT(*)
551
SELECT COUNT(*) FROM City WHERE Country LIKE 'A%';
COUNT(*)
107
SELECT COUNT(*) FROM City WHERE Country BETWEEN 'S' AND 'Z';
COUNT(*)
682
EXPLAIN
SELECT * FROM City
WHERE ID BETWEEN 500 AND 999 AND Population > 700000 AND Country LIKE 'C%';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range PRIMARY,Population,Country PRIMARY,Country,Population 4,3,4 NULL 5 Using sort_intersect(PRIMARY,Country,Population); Using where
EXPLAIN
SELECT * FROM City
WHERE ID BETWEEN 500 AND 999 AND Population > 1000000 AND Country LIKE 'A%';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range PRIMARY,Population,Country Population,Country 4,3 NULL 6 Using sort_intersect(Population,Country); Using where
EXPLAIN
SELECT * FROM City
WHERE ID BETWEEN 500 AND 999 AND Population > 300000 AND Country LIKE 'C%';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range PRIMARY,Population,Country Country,PRIMARY 3,4 NULL 65 Using sort_intersect(Country,PRIMARY); Using where
EXPLAIN
SELECT * FROM City
WHERE ID BETWEEN 3500 AND 3999 AND Population > 700000
AND Country BETWEEN 'S' AND 'Z';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range PRIMARY,Population,Country PRIMARY,Population 4,4 NULL 44 Using sort_intersect(PRIMARY,Population); Using where
EXPLAIN
SELECT * FROM City
WHERE ID BETWEEN 1 AND 1000 AND Population > 700000
AND Country BETWEEN 'S' AND 'Z' ;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range PRIMARY,Population,Country Population 4 NULL 359 Using where
SELECT * FROM City USE INDEX ()
WHERE ID BETWEEN 500 AND 999 AND Population > 700000 AND Country LIKE 'C%';
ID Name Country Population
554 Santiago de Chile CHL 4703954
SELECT * FROM City
WHERE ID BETWEEN 500 AND 999 AND Population > 700000 AND Country LIKE 'C%';
ID Name Country Population
554 Santiago de Chile CHL 4703954
SELECT * FROM City USE INDEX ()
WHERE ID BETWEEN 500 AND 999 AND Population > 1000000 AND Country LIKE 'A%';
ID Name Country Population
SELECT * FROM City
WHERE ID BETWEEN 500 AND 999 AND Population > 1000000 AND Country LIKE 'A%';
ID Name Country Population
SELECT * FROM City USE INDEX ()
WHERE ID BETWEEN 500 AND 999 AND Population > 300000 AND Country LIKE 'C%';
ID Name Country Population
554 Santiago de Chile CHL 4703954
555 Puente Alto CHL 386236
556 Viña del Mar CHL 312493
584 San José CRI 339131
SELECT * FROM City
WHERE ID BETWEEN 500 AND 999 AND Population > 300000 AND Country LIKE 'C%';
ID Name Country Population
554 Santiago de Chile CHL 4703954
555 Puente Alto CHL 386236
556 Viña del Mar CHL 312493
584 San José CRI 339131
SELECT * FROM City USE INDEX ()
WHERE ID BETWEEN 3500 AND 3999 AND Population > 700000
AND Country BETWEEN 'S' AND 'Z';
ID Name Country Population
3503 Toskent UZB 2117500
3539 Caracas VEN 1975294
3540 Maracaíbo VEN 1304776
3541 Barquisimeto VEN 877239
3542 Valencia VEN 794246
3769 Ho Chi Minh City VNM 3980000
3770 Hanoi VNM 1410000
3771 Haiphong VNM 783133
3793 New York USA 8008278
3794 Los Angeles USA 3694820
3795 Chicago USA 2896016
3796 Houston USA 1953631
3797 Philadelphia USA 1517550
3798 Phoenix USA 1321045
3799 San Diego USA 1223400
3800 Dallas USA 1188580
3801 San Antonio USA 1144646
3802 Detroit USA 951270
3803 San Jose USA 894943
3804 Indianapolis USA 791926
3805 San Francisco USA 776733
3806 Jacksonville USA 735167
3807 Columbus USA 711470
SELECT * FROM City
WHERE ID BETWEEN 3500 AND 3999 AND Population > 700000
AND Country BETWEEN 'S' AND 'Z';
ID Name Country Population
3503 Toskent UZB 2117500
3539 Caracas VEN 1975294
3540 Maracaíbo VEN 1304776
3541 Barquisimeto VEN 877239
3542 Valencia VEN 794246
3769 Ho Chi Minh City VNM 3980000
3770 Hanoi VNM 1410000
3771 Haiphong VNM 783133
3793 New York USA 8008278
3794 Los Angeles USA 3694820
3795 Chicago USA 2896016
3796 Houston USA 1953631
3797 Philadelphia USA 1517550
3798 Phoenix USA 1321045
3799 San Diego USA 1223400
3800 Dallas USA 1188580
3801 San Antonio USA 1144646
3802 Detroit USA 951270
3803 San Jose USA 894943
3804 Indianapolis USA 791926
3805 San Francisco USA 776733
3806 Jacksonville USA 735167
3807 Columbus USA 711470
SELECT * FROM City USE INDEX ()
WHERE ID BETWEEN 1 AND 1000 AND Population > 700000
AND Country BETWEEN 'S' AND 'Z' ;
ID Name Country Population
SELECT * FROM City
WHERE ID BETWEEN 1 AND 1000 AND Population > 700000
AND Country BETWEEN 'S' AND 'Z' ;
ID Name Country Population
SET SESSION sort_buffer_size = 2048;
EXPLAIN
SELECT * FROM City WHERE
Name LIKE 'C%' AND Population > 1000000;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,Name Name,Population 35,4 NULL 9 Using sort_intersect(Name,Population); Using where
EXPLAIN
SELECT * FROM City WHERE
Name LIKE 'M%' AND Population > 500000;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,Name Name 35 NULL 164 Using where
EXPLAIN
SELECT * FROM City
WHERE Name LIKE 'C%' AND Population > 1000000 AND Country LIKE 'C%';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,Country,Name Name,Population 35,4 NULL 9 Using sort_intersect(Name,Population); Using where
EXPLAIN
SELECT * FROM City
WHERE Name BETWEEN 'G' AND 'J' AND Population > 700000 AND Country LIKE 'M%';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,Country,Name Name 35 NULL 225 Using where
EXPLAIN
SELECT * FROM City
WHERE Name BETWEEN 'G' AND 'J' AND Population > 500000 AND Country LIKE 'C%';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,Country,Name Name 35 NULL 225 Using where
EXPLAIN
SELECT * FROM City
WHERE ID BETWEEN 500 AND 999 AND Population > 1000000 AND Country LIKE 'A%';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range PRIMARY,Population,Country Country,Population 3,4 NULL 6 Using sort_intersect(Country,Population); Using where
EXPLAIN
SELECT * FROM City
WHERE ID < 1000 AND Population > 700000 AND Country LIKE 'C%';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range PRIMARY,Population,Country Population 4 NULL 359 Using where
SELECT * FROM City WHERE
Name LIKE 'C%' AND Population > 1000000;
ID Name Country Population
71 Córdoba ARG 1157507
151 Chittagong BGD 1392860
212 Curitiba BRA 1584232
608 Cairo EGY 6789479
712 Cape Town ZAF 2352121
926 Conakry GIN 1090610
1026 Calcutta [Kolkata] IND 4399819
1027 Chennai (Madras) IND 3841396
1892 Chongqing CHN 6351600
1898 Chengdu CHN 3361500
1900 Changchun CHN 2812000
1910 Changsha CHN 1809800
2258 Cali COL 2077386
2485 Casablanca MAR 2940623
2515 Ciudad de México MEX 8591309
3539 Caracas VEN 1975294
3795 Chicago USA 2896016
SELECT * FROM City WHERE
Name LIKE 'M%' AND Population > 500000;
ID Name Country Population
223 Maceió BRA 786288
653 Madrid ESP 2879052
1042 Madurai IND 977856
658 Málaga ESP 530553
947 Malang IDN 716862
2734 Managua NIC 959000
215 Manaus BRA 1255049
2711 Mandalay MMR 885300
766 Manila PHL 1581082
2698 Maputo MOZ 1018938
77 Mar del Plata ARG 512880
3540 Maracaíbo VEN 1304776
2487 Marrakech MAR 621914
2975 Marseille FRA 798430
1381 Mashhad IRN 1887405
2300 Mbuji-Mayi COD 806475
942 Medan IDN 1843919
2259 Medellín COL 1861265
3176 Medina SAU 608300
1051 Meerut IND 753778
3175 Mekka SAU 965700
131 Melbourne AUS 2865329
3810 Memphis USA 650100
2530 Mérida MEX 703324
3364 Mersin (Içel) TUR 587212
2526 Mexicali MEX 764902
1465 Milano ITA 1300977
3811 Milwaukee USA 596974
3520 Minsk BLR 1674000
1816 Mississauga CAN 608072
3214 Mogadishu SOM 997000
2440 Monrovia LBR 850000
2523 Monterrey MEX 1108499
3492 Montevideo URY 1236000
1810 Montréal CAN 1016376
2537 Morelia MEX 619958
3580 Moscow RUS 8389200
1366 Mosul IRQ 879000
1945 Mudanjiang CHN 570000
2826 Multan PAK 1182441
1024 Mumbai (Bombay) IND 10500000
3070 Munich [München] DEU 1194560
3434 Mykolajiv UKR 508000
SELECT * FROM City
WHERE Name BETWEEN 'M' AND 'N' AND Population > 1000000 AND Country LIKE 'C%';
ID Name Country Population
2259 Medellín COL 1861265
1810 Montréal CAN 1016376
SELECT * FROM City
WHERE Name BETWEEN 'G' AND 'J' AND Population > 700000 AND Country LIKE 'M%';
ID Name Country Population
2516 Guadalajara MEX 1647720
SELECT * FROM City
WHERE Name BETWEEN 'G' AND 'J' AND Population > 500000 AND Country LIKE 'C%';
ID Name Country Population
1914 Guiyang CHN 1465200
1928 Handan CHN 840000
1905 Hangzhou CHN 2190500
1895 Harbin CHN 4289800
1916 Hefei CHN 1369100
1950 Hegang CHN 520000
1927 Hohhot CHN 916700
1937 Huainan CHN 700000
SELECT * FROM City
WHERE ID BETWEEN 500 AND 999 AND Population > 1000000 AND Country LIKE 'A%';
ID Name Country Population
SELECT * FROM City
WHERE ID < 1000 AND Population > 700000 AND Country LIKE 'C%';
ID Name Country Population
554 Santiago de Chile CHL 4703954
SET SESSION sort_buffer_size = default;
DROP INDEX Country ON City;
CREATE INDEX CountryID ON City(Country,ID);
CREATE INDEX CountryName ON City(Country,Name);
EXPLAIN
SELECT * FROM City
WHERE Country LIKE 'M%' AND Population > 700000;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,CountryID,CountryName Population,CountryID 4,3 NULL 23 Using sort_intersect(Population,CountryID); Using where
EXPLAIN
SELECT * FROM City
WHERE Country='CHN' AND Population > 1000000;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,CountryID,CountryName CountryID,Population 3,4 NULL 20 Using sort_intersect(CountryID,Population); Using where
EXPLAIN
SELECT * FROM City
WHERE Country='CHN' AND Population > 1000000 AND Name LIKE 'C%';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,Name,CountryID,CountryName CountryName 38 NULL 13 Using where
SELECT * FROM City USE INDEX ()
WHERE Country LIKE 'M%' AND Population > 700000;
ID Name Country Population
2464 Kuala Lumpur MYS 1297526
2482 Bamako MLI 809552
2485 Casablanca MAR 2940623
2515 Ciudad de México MEX 8591309
2516 Guadalajara MEX 1647720
2517 Ecatepec de Morelos MEX 1620303
2518 Puebla MEX 1346176
2519 Nezahualcóyotl MEX 1224924
2520 Juárez MEX 1217818
2521 Tijuana MEX 1212232
2522 León MEX 1133576
2523 Monterrey MEX 1108499
2524 Zapopan MEX 1002239
2525 Naucalpan de Juárez MEX 857511
2526 Mexicali MEX 764902
2527 Culiacán MEX 744859
2528 Acapulco de Juárez MEX 721011
2529 Tlalnepantla de Baz MEX 720755
2530 Mérida MEX 703324
2690 Chisinau MDA 719900
2696 Ulan Bator MNG 773700
2698 Maputo MOZ 1018938
2710 Rangoon (Yangon) MMR 3361700
2711 Mandalay MMR 885300
SELECT * FROM City
WHERE Country LIKE 'M%' AND Population > 700000;
ID Name Country Population
2464 Kuala Lumpur MYS 1297526
2482 Bamako MLI 809552
2485 Casablanca MAR 2940623
2515 Ciudad de México MEX 8591309
2516 Guadalajara MEX 1647720
2517 Ecatepec de Morelos MEX 1620303
2518 Puebla MEX 1346176
2519 Nezahualcóyotl MEX 1224924
2520 Juárez MEX 1217818
2521 Tijuana MEX 1212232
2522 León MEX 1133576
2523 Monterrey MEX 1108499
2524 Zapopan MEX 1002239
2525 Naucalpan de Juárez MEX 857511
2526 Mexicali MEX 764902
2527 Culiacán MEX 744859
2528 Acapulco de Juárez MEX 721011
2529 Tlalnepantla de Baz MEX 720755
2530 Mérida MEX 703324
2690 Chisinau MDA 719900
2696 Ulan Bator MNG 773700
2698 Maputo MOZ 1018938
2710 Rangoon (Yangon) MMR 3361700
2711 Mandalay MMR 885300
SELECT * FROM City USE INDEX ()
WHERE Country='CHN' AND Population > 1000000;
ID Name Country Population
1890 Shanghai CHN 9696300
1891 Peking CHN 7472000
1892 Chongqing CHN 6351600
1893 Tianjin CHN 5286800
1894 Wuhan CHN 4344600
1895 Harbin CHN 4289800
1896 Shenyang CHN 4265200
1897 Kanton [Guangzhou] CHN 4256300
1898 Chengdu CHN 3361500
1899 Nanking [Nanjing] CHN 2870300
1900 Changchun CHN 2812000
1901 Xi´an CHN 2761400
1902 Dalian CHN 2697000
1903 Qingdao CHN 2596000
1904 Jinan CHN 2278100
1905 Hangzhou CHN 2190500
1906 Zhengzhou CHN 2107200
1907 Shijiazhuang CHN 2041500
1908 Taiyuan CHN 1968400
1909 Kunming CHN 1829500
1910 Changsha CHN 1809800
1911 Nanchang CHN 1691600
1912 Fuzhou CHN 1593800
1913 Lanzhou CHN 1565800
1914 Guiyang CHN 1465200
1915 Ningbo CHN 1371200
1916 Hefei CHN 1369100
1917 Urumt?i [Ürümqi] CHN 1310100
1918 Anshan CHN 1200000
1919 Fushun CHN 1200000
1920 Nanning CHN 1161800
1921 Zibo CHN 1140000
1922 Qiqihar CHN 1070000
1923 Jilin CHN 1040000
1924 Tangshan CHN 1040000
SELECT * FROM City
WHERE Country='CHN' AND Population > 1000000;
ID Name Country Population
1890 Shanghai CHN 9696300
1891 Peking CHN 7472000
1892 Chongqing CHN 6351600
1893 Tianjin CHN 5286800
1894 Wuhan CHN 4344600
1895 Harbin CHN 4289800
1896 Shenyang CHN 4265200
1897 Kanton [Guangzhou] CHN 4256300
1898 Chengdu CHN 3361500
1899 Nanking [Nanjing] CHN 2870300
1900 Changchun CHN 2812000
1901 Xi´an CHN 2761400
1902 Dalian CHN 2697000
1903 Qingdao CHN 2596000
1904 Jinan CHN 2278100
1905 Hangzhou CHN 2190500
1906 Zhengzhou CHN 2107200
1907 Shijiazhuang CHN 2041500
1908 Taiyuan CHN 1968400
1909 Kunming CHN 1829500
1910 Changsha CHN 1809800
1911 Nanchang CHN 1691600
1912 Fuzhou CHN 1593800
1913 Lanzhou CHN 1565800
1914 Guiyang CHN 1465200
1915 Ningbo CHN 1371200
1916 Hefei CHN 1369100
1917 Urumt?i [Ürümqi] CHN 1310100
1918 Anshan CHN 1200000
1919 Fushun CHN 1200000
1920 Nanning CHN 1161800
1921 Zibo CHN 1140000
1922 Qiqihar CHN 1070000
1923 Jilin CHN 1040000
1924 Tangshan CHN 1040000
SELECT * FROM City USE INDEX ()
WHERE Country='CHN' AND Population > 1000000 AND Name LIKE 'C%';
ID Name Country Population
1892 Chongqing CHN 6351600
1898 Chengdu CHN 3361500
1900 Changchun CHN 2812000
1910 Changsha CHN 1809800
SELECT * FROM City
WHERE Country='CHN' AND Population > 1000000 AND Name LIKE 'C%';
ID Name Country Population
1900 Changchun CHN 2812000
1910 Changsha CHN 1809800
1898 Chengdu CHN 3361500
1892 Chongqing CHN 6351600
DROP DATABASE world;
use test;
SET SESSION optimizer_switch='index_merge_sort_intersection=on';

View File

@ -0,0 +1,923 @@
SET SESSION STORAGE_ENGINE='InnoDB';
DROP TABLE IF EXISTS t1,t2,t3,t4;
DROP DATABASE IF EXISTS world;
set names utf8;
CREATE DATABASE world;
use world;
CREATE TABLE Country (
Code char(3) NOT NULL default '',
Name char(52) NOT NULL default '',
SurfaceArea float(10,2) NOT NULL default '0.00',
Population int(11) NOT NULL default '0',
Capital int(11) default NULL,
PRIMARY KEY (Code),
UNIQUE INDEX (Name)
);
CREATE TABLE City (
ID int(11) NOT NULL auto_increment,
Name char(35) NOT NULL default '',
Country char(3) NOT NULL default '',
Population int(11) NOT NULL default '0',
PRIMARY KEY (ID),
INDEX (Population),
INDEX (Country)
);
CREATE TABLE CountryLanguage (
Country char(3) NOT NULL default '',
Language char(30) NOT NULL default '',
Percentage float(3,1) NOT NULL default '0.0',
PRIMARY KEY (Country, Language),
INDEX (Percentage)
);
SELECT COUNT(*) FROM Country;
COUNT(*)
239
SELECT COUNT(*) FROM City;
COUNT(*)
4079
SELECT COUNT(*) FROM CountryLanguage;
COUNT(*)
984
CREATE INDEX Name ON City(Name);
SET SESSION optimizer_switch='index_merge_sort_intersection=on';
SELECT COUNT(*) FROM City;
COUNT(*)
4079
SELECT COUNT(*) FROM City WHERE Name LIKE 'C%';
COUNT(*)
281
SELECT COUNT(*) FROM City WHERE Name LIKE 'M%';
COUNT(*)
301
SELECT COUNT(*) FROM City WHERE Population > 1000000;
COUNT(*)
237
SELECT COUNT(*) FROM City WHERE Population > 500000;
COUNT(*)
539
SELECT COUNT(*) FROM City WHERE Population > 300000;
COUNT(*)
1062
SELECT COUNT(*) FROM City WHERE Population > 5000000;
COUNT(*)
24
EXPLAIN
SELECT * FROM City WHERE
Name LIKE 'C%' AND Population > 1000000;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,Name Name,Population 35,4 NULL 16 Using sort_intersect(Name,Population); Using where
EXPLAIN
SELECT * FROM City WHERE
Name LIKE 'M%' AND Population > 500000;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,Name Population,Name 4,35 NULL 40 Using sort_intersect(Population,Name); Using where
EXPLAIN
SELECT * FROM City
WHERE Name LIKE 'M%' AND Population > 300000;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,Name Population,Name 4,35 NULL 79 Using sort_intersect(Population,Name); Using where
EXPLAIN
SELECT * FROM City
WHERE Name LIKE 'M%' AND Population > 5000000;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,Name Population,Name 4,35 NULL 1 Using sort_intersect(Population,Name); Using where
SELECT * FROM City USE INDEX ()
WHERE Name LIKE 'C%' AND Population > 1000000;
ID Name Country Population
71 Córdoba ARG 1157507
151 Chittagong BGD 1392860
212 Curitiba BRA 1584232
608 Cairo EGY 6789479
712 Cape Town ZAF 2352121
926 Conakry GIN 1090610
1026 Calcutta [Kolkata] IND 4399819
1027 Chennai (Madras) IND 3841396
1892 Chongqing CHN 6351600
1898 Chengdu CHN 3361500
1900 Changchun CHN 2812000
1910 Changsha CHN 1809800
2258 Cali COL 2077386
2485 Casablanca MAR 2940623
2515 Ciudad de México MEX 8591309
3539 Caracas VEN 1975294
3795 Chicago USA 2896016
SELECT * FROM City
WHERE Name LIKE 'C%' AND Population > 1000000;
ID Name Country Population
71 Córdoba ARG 1157507
151 Chittagong BGD 1392860
212 Curitiba BRA 1584232
608 Cairo EGY 6789479
712 Cape Town ZAF 2352121
926 Conakry GIN 1090610
1026 Calcutta [Kolkata] IND 4399819
1027 Chennai (Madras) IND 3841396
1892 Chongqing CHN 6351600
1898 Chengdu CHN 3361500
1900 Changchun CHN 2812000
1910 Changsha CHN 1809800
2258 Cali COL 2077386
2485 Casablanca MAR 2940623
2515 Ciudad de México MEX 8591309
3539 Caracas VEN 1975294
3795 Chicago USA 2896016
SELECT * FROM City USE INDEX ()
WHERE Name LIKE 'M%' AND Population > 500000;
ID Name Country Population
77 Mar del Plata ARG 512880
131 Melbourne AUS 2865329
215 Manaus BRA 1255049
223 Maceió BRA 786288
653 Madrid ESP 2879052
658 Málaga ESP 530553
766 Manila PHL 1581082
942 Medan IDN 1843919
947 Malang IDN 716862
1024 Mumbai (Bombay) IND 10500000
1042 Madurai IND 977856
1051 Meerut IND 753778
1366 Mosul IRQ 879000
1381 Mashhad IRN 1887405
1465 Milano ITA 1300977
1810 Montréal CAN 1016376
1816 Mississauga CAN 608072
1945 Mudanjiang CHN 570000
2259 Medellín COL 1861265
2300 Mbuji-Mayi COD 806475
2440 Monrovia LBR 850000
2487 Marrakech MAR 621914
2523 Monterrey MEX 1108499
2526 Mexicali MEX 764902
2530 Mérida MEX 703324
2537 Morelia MEX 619958
2698 Maputo MOZ 1018938
2711 Mandalay MMR 885300
2734 Managua NIC 959000
2826 Multan PAK 1182441
2975 Marseille FRA 798430
3070 Munich [München] DEU 1194560
3175 Mekka SAU 965700
3176 Medina SAU 608300
3214 Mogadishu SOM 997000
3364 Mersin (Içel) TUR 587212
3434 Mykolajiv UKR 508000
3492 Montevideo URY 1236000
3520 Minsk BLR 1674000
3540 Maracaíbo VEN 1304776
3580 Moscow RUS 8389200
3810 Memphis USA 650100
3811 Milwaukee USA 596974
SELECT * FROM City
WHERE Name LIKE 'M%' AND Population > 500000;
ID Name Country Population
77 Mar del Plata ARG 512880
131 Melbourne AUS 2865329
215 Manaus BRA 1255049
223 Maceió BRA 786288
653 Madrid ESP 2879052
658 Málaga ESP 530553
766 Manila PHL 1581082
942 Medan IDN 1843919
947 Malang IDN 716862
1024 Mumbai (Bombay) IND 10500000
1042 Madurai IND 977856
1051 Meerut IND 753778
1366 Mosul IRQ 879000
1381 Mashhad IRN 1887405
1465 Milano ITA 1300977
1810 Montréal CAN 1016376
1816 Mississauga CAN 608072
1945 Mudanjiang CHN 570000
2259 Medellín COL 1861265
2300 Mbuji-Mayi COD 806475
2440 Monrovia LBR 850000
2487 Marrakech MAR 621914
2523 Monterrey MEX 1108499
2526 Mexicali MEX 764902
2530 Mérida MEX 703324
2537 Morelia MEX 619958
2698 Maputo MOZ 1018938
2711 Mandalay MMR 885300
2734 Managua NIC 959000
2826 Multan PAK 1182441
2975 Marseille FRA 798430
3070 Munich [München] DEU 1194560
3175 Mekka SAU 965700
3176 Medina SAU 608300
3214 Mogadishu SOM 997000
3364 Mersin (Içel) TUR 587212
3434 Mykolajiv UKR 508000
3492 Montevideo URY 1236000
3520 Minsk BLR 1674000
3540 Maracaíbo VEN 1304776
3580 Moscow RUS 8389200
3810 Memphis USA 650100
3811 Milwaukee USA 596974
SELECT * FROM City USE INDEX ()
WHERE Name LIKE 'M%' AND Population > 300000;
ID Name Country Population
77 Mar del Plata ARG 512880
80 Merlo ARG 463846
83 Moreno ARG 356993
87 Morón ARG 349246
131 Melbourne AUS 2865329
215 Manaus BRA 1255049
223 Maceió BRA 786288
250 Mauá BRA 375055
256 Moji das Cruzes BRA 339194
462 Manchester GBR 430000
653 Madrid ESP 2879052
658 Málaga ESP 530553
661 Murcia ESP 353504
766 Manila PHL 1581082
778 Makati PHL 444867
781 Marikina PHL 391170
783 Muntinlupa PHL 379310
786 Malabon PHL 338855
942 Medan IDN 1843919
947 Malang IDN 716862
962 Manado IDN 332288
963 Mataram IDN 306600
1024 Mumbai (Bombay) IND 10500000
1042 Madurai IND 977856
1051 Meerut IND 753778
1074 Mysore IND 480692
1081 Moradabad IND 429214
1098 Malegaon IND 342595
1366 Mosul IRQ 879000
1381 Mashhad IRN 1887405
1465 Milano ITA 1300977
1559 Matsuyama JPN 466133
1560 Matsudo JPN 461126
1578 Machida JPN 364197
1595 Miyazaki JPN 303784
1810 Montréal CAN 1016376
1816 Mississauga CAN 608072
1882 Mombasa KEN 461753
1945 Mudanjiang CHN 570000
2005 Ma´anshan CHN 305421
2259 Medellín COL 1861265
2267 Manizales COL 337580
2300 Mbuji-Mayi COD 806475
2348 Masan KOR 441242
2440 Monrovia LBR 850000
2454 Macao MAC 437500
2487 Marrakech MAR 621914
2491 Meknès MAR 460000
2523 Monterrey MEX 1108499
2526 Mexicali MEX 764902
2530 Mérida MEX 703324
2537 Morelia MEX 619958
2554 Matamoros MEX 416428
2557 Mazatlán MEX 380265
2698 Maputo MOZ 1018938
2699 Matola MOZ 424662
2711 Mandalay MMR 885300
2712 Moulmein (Mawlamyine) MMR 307900
2734 Managua NIC 959000
2756 Mushin NGA 333200
2757 Maiduguri NGA 320000
2826 Multan PAK 1182441
2975 Marseille FRA 798430
3070 Munich [München] DEU 1194560
3086 Mannheim DEU 307730
3175 Mekka SAU 965700
3176 Medina SAU 608300
3214 Mogadishu SOM 997000
3364 Mersin (Içel) TUR 587212
3371 Malatya TUR 330312
3434 Mykolajiv UKR 508000
3435 Mariupol UKR 490000
3438 Makijivka UKR 384000
3492 Montevideo URY 1236000
3520 Minsk BLR 1674000
3522 Mogiljov BLR 356000
3540 Maracaíbo VEN 1304776
3545 Maracay VEN 444443
3547 Maturín VEN 319726
3580 Moscow RUS 8389200
3622 Magnitogorsk RUS 427900
3625 Murmansk RUS 376300
3636 Mahat?kala RUS 332800
3810 Memphis USA 650100
3811 Milwaukee USA 596974
3834 Mesa USA 396375
3837 Minneapolis USA 382618
3839 Miami USA 362470
SELECT * FROM City
WHERE Name LIKE 'M%' AND Population > 300000;
ID Name Country Population
77 Mar del Plata ARG 512880
80 Merlo ARG 463846
83 Moreno ARG 356993
87 Morón ARG 349246
131 Melbourne AUS 2865329
215 Manaus BRA 1255049
223 Maceió BRA 786288
250 Mauá BRA 375055
256 Moji das Cruzes BRA 339194
462 Manchester GBR 430000
653 Madrid ESP 2879052
658 Málaga ESP 530553
661 Murcia ESP 353504
766 Manila PHL 1581082
778 Makati PHL 444867
781 Marikina PHL 391170
783 Muntinlupa PHL 379310
786 Malabon PHL 338855
942 Medan IDN 1843919
947 Malang IDN 716862
962 Manado IDN 332288
963 Mataram IDN 306600
1024 Mumbai (Bombay) IND 10500000
1042 Madurai IND 977856
1051 Meerut IND 753778
1074 Mysore IND 480692
1081 Moradabad IND 429214
1098 Malegaon IND 342595
1366 Mosul IRQ 879000
1381 Mashhad IRN 1887405
1465 Milano ITA 1300977
1559 Matsuyama JPN 466133
1560 Matsudo JPN 461126
1578 Machida JPN 364197
1595 Miyazaki JPN 303784
1810 Montréal CAN 1016376
1816 Mississauga CAN 608072
1882 Mombasa KEN 461753
1945 Mudanjiang CHN 570000
2005 Ma´anshan CHN 305421
2259 Medellín COL 1861265
2267 Manizales COL 337580
2300 Mbuji-Mayi COD 806475
2348 Masan KOR 441242
2440 Monrovia LBR 850000
2454 Macao MAC 437500
2487 Marrakech MAR 621914
2491 Meknès MAR 460000
2523 Monterrey MEX 1108499
2526 Mexicali MEX 764902
2530 Mérida MEX 703324
2537 Morelia MEX 619958
2554 Matamoros MEX 416428
2557 Mazatlán MEX 380265
2698 Maputo MOZ 1018938
2699 Matola MOZ 424662
2711 Mandalay MMR 885300
2712 Moulmein (Mawlamyine) MMR 307900
2734 Managua NIC 959000
2756 Mushin NGA 333200
2757 Maiduguri NGA 320000
2826 Multan PAK 1182441
2975 Marseille FRA 798430
3070 Munich [München] DEU 1194560
3086 Mannheim DEU 307730
3175 Mekka SAU 965700
3176 Medina SAU 608300
3214 Mogadishu SOM 997000
3364 Mersin (Içel) TUR 587212
3371 Malatya TUR 330312
3434 Mykolajiv UKR 508000
3435 Mariupol UKR 490000
3438 Makijivka UKR 384000
3492 Montevideo URY 1236000
3520 Minsk BLR 1674000
3522 Mogiljov BLR 356000
3540 Maracaíbo VEN 1304776
3545 Maracay VEN 444443
3547 Maturín VEN 319726
3580 Moscow RUS 8389200
3622 Magnitogorsk RUS 427900
3625 Murmansk RUS 376300
3636 Mahat?kala RUS 332800
3810 Memphis USA 650100
3811 Milwaukee USA 596974
3834 Mesa USA 396375
3837 Minneapolis USA 382618
3839 Miami USA 362470
SELECT * FROM City USE INDEX ()
WHERE Name LIKE 'M%' AND Population > 5000000;
ID Name Country Population
1024 Mumbai (Bombay) IND 10500000
3580 Moscow RUS 8389200
SELECT * FROM City
WHERE Name LIKE 'M%' AND Population > 5000000;
ID Name Country Population
1024 Mumbai (Bombay) IND 10500000
3580 Moscow RUS 8389200
SELECT COUNT(*) FROM City WHERE Name BETWEEN 'M' AND 'N';
COUNT(*)
301
SELECT COUNT(*) FROM City WHERE Name BETWEEN 'G' AND 'J';
COUNT(*)
408
SELECT COUNT(*) FROM City WHERE Population > 1000000;
COUNT(*)
237
SELECT COUNT(*) FROM City WHERE Population > 700000;
COUNT(*)
358
SELECT COUNT(*) FROM City WHERE Population > 500000;
COUNT(*)
539
SELECT COUNT(*) FROM City WHERE Country LIKE 'C%';
COUNT(*)
551
SELECT COUNT(*) FROM City WHERE Country LIKE 'L%';
COUNT(*)
29
EXPLAIN
SELECT * FROM City
WHERE Name BETWEEN 'M' AND 'N' AND Population > 1000000 AND Country LIKE 'C%';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,Country,Name Population,Name,Country 4,35,3 NULL 2 Using sort_intersect(Population,Name,Country); Using where
EXPLAIN
SELECT * FROM City
WHERE Name BETWEEN 'G' AND 'J' AND Population > 700000 AND Country LIKE 'L%';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,Country,Name Country,Population 3,4 NULL 2 Using sort_intersect(Country,Population); Using where
EXPLAIN
SELECT * FROM City
WHERE Name BETWEEN 'G' AND 'J' AND Population > 500000 AND Country LIKE 'C%';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,Country,Name Population,Country,Name 4,3,35 NULL 7 Using sort_intersect(Population,Country,Name); Using where
SELECT * FROM City USE INDEX ()
WHERE Name BETWEEN 'M' AND 'N' AND Population > 1000000 AND Country LIKE 'C%';
ID Name Country Population
1810 Montréal CAN 1016376
2259 Medellín COL 1861265
SELECT * FROM City
WHERE Name BETWEEN 'M' AND 'N' AND Population > 1000000 AND Country LIKE 'C%';
ID Name Country Population
1810 Montréal CAN 1016376
2259 Medellín COL 1861265
SELECT * FROM City USE INDEX ()
WHERE Name BETWEEN 'G' AND 'J' AND Population > 700000 AND Country LIKE 'M%';
ID Name Country Population
2516 Guadalajara MEX 1647720
SELECT * FROM City
WHERE Name BETWEEN 'G' AND 'J' AND Population > 700000 AND Country LIKE 'M%';
ID Name Country Population
2516 Guadalajara MEX 1647720
SELECT * FROM City USE INDEX ()
WHERE Name BETWEEN 'G' AND 'J' AND Population > 500000 AND Country LIKE 'C%';
ID Name Country Population
1895 Harbin CHN 4289800
1905 Hangzhou CHN 2190500
1914 Guiyang CHN 1465200
1916 Hefei CHN 1369100
1927 Hohhot CHN 916700
1928 Handan CHN 840000
1937 Huainan CHN 700000
1950 Hegang CHN 520000
SELECT * FROM City
WHERE Name BETWEEN 'G' AND 'J' AND Population > 500000 AND Country LIKE 'C%';
ID Name Country Population
1895 Harbin CHN 4289800
1905 Hangzhou CHN 2190500
1914 Guiyang CHN 1465200
1916 Hefei CHN 1369100
1927 Hohhot CHN 916700
1928 Handan CHN 840000
1937 Huainan CHN 700000
1950 Hegang CHN 520000
SELECT COUNT(*) FROM City WHERE ID BETWEEN 500 AND 999;
COUNT(*)
500
SELECT COUNT(*) FROM City WHERE ID BETWEEN 3500 AND 3999;
COUNT(*)
500
SELECT COUNT(*) FROM City WHERE ID BETWEEN 1 AND 1000;
COUNT(*)
1000
SELECT COUNT(*) FROM City WHERE Population > 700000;
COUNT(*)
358
SELECT COUNT(*) FROM City WHERE Population > 1000000;
COUNT(*)
237
SELECT COUNT(*) FROM City WHERE Population > 300000;
COUNT(*)
1062
SELECT COUNT(*) FROM City WHERE Country LIKE 'C%';
COUNT(*)
551
SELECT COUNT(*) FROM City WHERE Country LIKE 'A%';
COUNT(*)
107
SELECT COUNT(*) FROM City WHERE Country BETWEEN 'S' AND 'Z';
COUNT(*)
682
EXPLAIN
SELECT * FROM City
WHERE ID BETWEEN 500 AND 999 AND Population > 700000 AND Country LIKE 'C%';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range PRIMARY,Population,Country PRIMARY,Country,Population 4,3,4 NULL 11 Using sort_intersect(PRIMARY,Country,Population); Using where
EXPLAIN
SELECT * FROM City
WHERE ID BETWEEN 500 AND 999 AND Population > 1000000 AND Country LIKE 'A%';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range PRIMARY,Population,Country PRIMARY,Population,Country 4,4,3 NULL 1 Using sort_intersect(PRIMARY,Population,Country); Using where
EXPLAIN
SELECT * FROM City
WHERE ID BETWEEN 500 AND 999 AND Population > 300000 AND Country LIKE 'C%';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range PRIMARY,Population,Country PRIMARY,Population,Country 4,4,3 NULL 34 Using sort_intersect(PRIMARY,Population,Country); Using where
EXPLAIN
SELECT * FROM City
WHERE ID BETWEEN 3500 AND 3999 AND Population > 700000
AND Country BETWEEN 'S' AND 'Z';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range PRIMARY,Population,Country PRIMARY,Country,Population 4,3,4 NULL 12 Using sort_intersect(PRIMARY,Country,Population); Using where
EXPLAIN
SELECT * FROM City
WHERE ID BETWEEN 1 AND 1000 AND Population > 700000
AND Country BETWEEN 'S' AND 'Z' ;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range PRIMARY,Population,Country PRIMARY,Country,Population 4,3,4 NULL 21 Using sort_intersect(PRIMARY,Country,Population); Using where
SELECT * FROM City USE INDEX ()
WHERE ID BETWEEN 500 AND 999 AND Population > 700000 AND Country LIKE 'C%';
ID Name Country Population
554 Santiago de Chile CHL 4703954
SELECT * FROM City
WHERE ID BETWEEN 500 AND 999 AND Population > 700000 AND Country LIKE 'C%';
ID Name Country Population
554 Santiago de Chile CHL 4703954
SELECT * FROM City USE INDEX ()
WHERE ID BETWEEN 500 AND 999 AND Population > 1000000 AND Country LIKE 'A%';
ID Name Country Population
SELECT * FROM City
WHERE ID BETWEEN 500 AND 999 AND Population > 1000000 AND Country LIKE 'A%';
ID Name Country Population
SELECT * FROM City USE INDEX ()
WHERE ID BETWEEN 500 AND 999 AND Population > 300000 AND Country LIKE 'C%';
ID Name Country Population
554 Santiago de Chile CHL 4703954
555 Puente Alto CHL 386236
556 Viña del Mar CHL 312493
584 San José CRI 339131
SELECT * FROM City
WHERE ID BETWEEN 500 AND 999 AND Population > 300000 AND Country LIKE 'C%';
ID Name Country Population
554 Santiago de Chile CHL 4703954
555 Puente Alto CHL 386236
556 Viña del Mar CHL 312493
584 San José CRI 339131
SELECT * FROM City USE INDEX ()
WHERE ID BETWEEN 3500 AND 3999 AND Population > 700000
AND Country BETWEEN 'S' AND 'Z';
ID Name Country Population
3503 Toskent UZB 2117500
3539 Caracas VEN 1975294
3540 Maracaíbo VEN 1304776
3541 Barquisimeto VEN 877239
3542 Valencia VEN 794246
3769 Ho Chi Minh City VNM 3980000
3770 Hanoi VNM 1410000
3771 Haiphong VNM 783133
3793 New York USA 8008278
3794 Los Angeles USA 3694820
3795 Chicago USA 2896016
3796 Houston USA 1953631
3797 Philadelphia USA 1517550
3798 Phoenix USA 1321045
3799 San Diego USA 1223400
3800 Dallas USA 1188580
3801 San Antonio USA 1144646
3802 Detroit USA 951270
3803 San Jose USA 894943
3804 Indianapolis USA 791926
3805 San Francisco USA 776733
3806 Jacksonville USA 735167
3807 Columbus USA 711470
SELECT * FROM City
WHERE ID BETWEEN 3500 AND 3999 AND Population > 700000
AND Country BETWEEN 'S' AND 'Z';
ID Name Country Population
3503 Toskent UZB 2117500
3539 Caracas VEN 1975294
3540 Maracaíbo VEN 1304776
3541 Barquisimeto VEN 877239
3542 Valencia VEN 794246
3769 Ho Chi Minh City VNM 3980000
3770 Hanoi VNM 1410000
3771 Haiphong VNM 783133
3793 New York USA 8008278
3794 Los Angeles USA 3694820
3795 Chicago USA 2896016
3796 Houston USA 1953631
3797 Philadelphia USA 1517550
3798 Phoenix USA 1321045
3799 San Diego USA 1223400
3800 Dallas USA 1188580
3801 San Antonio USA 1144646
3802 Detroit USA 951270
3803 San Jose USA 894943
3804 Indianapolis USA 791926
3805 San Francisco USA 776733
3806 Jacksonville USA 735167
3807 Columbus USA 711470
SELECT * FROM City USE INDEX ()
WHERE ID BETWEEN 1 AND 1000 AND Population > 700000
AND Country BETWEEN 'S' AND 'Z' ;
ID Name Country Population
SELECT * FROM City
WHERE ID BETWEEN 1 AND 1000 AND Population > 700000
AND Country BETWEEN 'S' AND 'Z' ;
ID Name Country Population
SET SESSION sort_buffer_size = 2048;
EXPLAIN
SELECT * FROM City WHERE
Name LIKE 'C%' AND Population > 1000000;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,Name Population,Name 4,35 NULL 16 Using sort_intersect(Population,Name); Using where
EXPLAIN
SELECT * FROM City WHERE
Name LIKE 'M%' AND Population > 500000;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,Name Name,Population 35,4 NULL 40 Using sort_intersect(Name,Population); Using where
EXPLAIN
SELECT * FROM City
WHERE Name LIKE 'C%' AND Population > 1000000 AND Country LIKE 'C%';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,Country,Name Population,Name 4,35 NULL 16 Using sort_intersect(Population,Name); Using where
EXPLAIN
SELECT * FROM City
WHERE Name BETWEEN 'G' AND 'J' AND Population > 700000 AND Country LIKE 'M%';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,Country,Name Population,Name 4,35 NULL 36 Using sort_intersect(Population,Name); Using where
EXPLAIN
SELECT * FROM City
WHERE Name BETWEEN 'G' AND 'J' AND Population > 500000 AND Country LIKE 'C%';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,Country,Name Name,Population,Country 35,4,3 NULL 7 Using sort_intersect(Name,Population,Country); Using where
EXPLAIN
SELECT * FROM City
WHERE ID BETWEEN 500 AND 999 AND Population > 1000000 AND Country LIKE 'A%';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range PRIMARY,Population,Country PRIMARY,Population,Country 4,4,3 NULL 1 Using sort_intersect(PRIMARY,Population,Country); Using where
EXPLAIN
SELECT * FROM City
WHERE ID < 1000 AND Population > 700000 AND Country LIKE 'C%';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range PRIMARY,Population,Country PRIMARY,Country,Population 4,3,4 NULL 17 Using sort_intersect(PRIMARY,Country,Population); Using where
SELECT * FROM City WHERE
Name LIKE 'C%' AND Population > 1000000;
ID Name Country Population
71 Córdoba ARG 1157507
151 Chittagong BGD 1392860
212 Curitiba BRA 1584232
608 Cairo EGY 6789479
712 Cape Town ZAF 2352121
926 Conakry GIN 1090610
1026 Calcutta [Kolkata] IND 4399819
1027 Chennai (Madras) IND 3841396
1892 Chongqing CHN 6351600
1898 Chengdu CHN 3361500
1900 Changchun CHN 2812000
1910 Changsha CHN 1809800
2258 Cali COL 2077386
2485 Casablanca MAR 2940623
2515 Ciudad de México MEX 8591309
3539 Caracas VEN 1975294
3795 Chicago USA 2896016
SELECT * FROM City WHERE
Name LIKE 'M%' AND Population > 500000;
ID Name Country Population
77 Mar del Plata ARG 512880
131 Melbourne AUS 2865329
215 Manaus BRA 1255049
223 Maceió BRA 786288
653 Madrid ESP 2879052
658 Málaga ESP 530553
766 Manila PHL 1581082
942 Medan IDN 1843919
947 Malang IDN 716862
1024 Mumbai (Bombay) IND 10500000
1042 Madurai IND 977856
1051 Meerut IND 753778
1366 Mosul IRQ 879000
1381 Mashhad IRN 1887405
1465 Milano ITA 1300977
1810 Montréal CAN 1016376
1816 Mississauga CAN 608072
1945 Mudanjiang CHN 570000
2259 Medellín COL 1861265
2300 Mbuji-Mayi COD 806475
2440 Monrovia LBR 850000
2487 Marrakech MAR 621914
2523 Monterrey MEX 1108499
2526 Mexicali MEX 764902
2530 Mérida MEX 703324
2537 Morelia MEX 619958
2698 Maputo MOZ 1018938
2711 Mandalay MMR 885300
2734 Managua NIC 959000
2826 Multan PAK 1182441
2975 Marseille FRA 798430
3070 Munich [München] DEU 1194560
3175 Mekka SAU 965700
3176 Medina SAU 608300
3214 Mogadishu SOM 997000
3364 Mersin (Içel) TUR 587212
3434 Mykolajiv UKR 508000
3492 Montevideo URY 1236000
3520 Minsk BLR 1674000
3540 Maracaíbo VEN 1304776
3580 Moscow RUS 8389200
3810 Memphis USA 650100
3811 Milwaukee USA 596974
SELECT * FROM City
WHERE Name BETWEEN 'M' AND 'N' AND Population > 1000000 AND Country LIKE 'C%';
ID Name Country Population
1810 Montréal CAN 1016376
2259 Medellín COL 1861265
SELECT * FROM City
WHERE Name BETWEEN 'G' AND 'J' AND Population > 700000 AND Country LIKE 'M%';
ID Name Country Population
2516 Guadalajara MEX 1647720
SELECT * FROM City
WHERE Name BETWEEN 'G' AND 'J' AND Population > 500000 AND Country LIKE 'C%';
ID Name Country Population
1895 Harbin CHN 4289800
1905 Hangzhou CHN 2190500
1914 Guiyang CHN 1465200
1916 Hefei CHN 1369100
1927 Hohhot CHN 916700
1928 Handan CHN 840000
1937 Huainan CHN 700000
1950 Hegang CHN 520000
SELECT * FROM City
WHERE ID BETWEEN 500 AND 999 AND Population > 1000000 AND Country LIKE 'A%';
ID Name Country Population
SELECT * FROM City
WHERE ID < 1000 AND Population > 700000 AND Country LIKE 'C%';
ID Name Country Population
554 Santiago de Chile CHL 4703954
SET SESSION sort_buffer_size = default;
DROP INDEX Country ON City;
CREATE INDEX CountryID ON City(Country,ID);
CREATE INDEX CountryName ON City(Country,Name);
EXPLAIN
SELECT * FROM City
WHERE Country LIKE 'M%' AND Population > 700000;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,CountryID,CountryName Population,CountryID 4,3 NULL 24 Using sort_intersect(Population,CountryID); Using where
EXPLAIN
SELECT * FROM City
WHERE Country='CHN' AND Population > 1000000;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,CountryID,CountryName CountryID,Population 3,4 NULL 21 Using sort_intersect(CountryID,Population); Using where
EXPLAIN
SELECT * FROM City
WHERE Country='CHN' AND Population > 1000000 AND Name LIKE 'C%';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,Name,CountryID,CountryName CountryName,Population 38,4 NULL 1 Using sort_intersect(CountryName,Population); Using where
SELECT * FROM City USE INDEX ()
WHERE Country LIKE 'M%' AND Population > 700000;
ID Name Country Population
2464 Kuala Lumpur MYS 1297526
2482 Bamako MLI 809552
2485 Casablanca MAR 2940623
2515 Ciudad de México MEX 8591309
2516 Guadalajara MEX 1647720
2517 Ecatepec de Morelos MEX 1620303
2518 Puebla MEX 1346176
2519 Nezahualcóyotl MEX 1224924
2520 Juárez MEX 1217818
2521 Tijuana MEX 1212232
2522 León MEX 1133576
2523 Monterrey MEX 1108499
2524 Zapopan MEX 1002239
2525 Naucalpan de Juárez MEX 857511
2526 Mexicali MEX 764902
2527 Culiacán MEX 744859
2528 Acapulco de Juárez MEX 721011
2529 Tlalnepantla de Baz MEX 720755
2530 Mérida MEX 703324
2690 Chisinau MDA 719900
2696 Ulan Bator MNG 773700
2698 Maputo MOZ 1018938
2710 Rangoon (Yangon) MMR 3361700
2711 Mandalay MMR 885300
SELECT * FROM City
WHERE Country LIKE 'M%' AND Population > 700000;
ID Name Country Population
2464 Kuala Lumpur MYS 1297526
2482 Bamako MLI 809552
2485 Casablanca MAR 2940623
2515 Ciudad de México MEX 8591309
2516 Guadalajara MEX 1647720
2517 Ecatepec de Morelos MEX 1620303
2518 Puebla MEX 1346176
2519 Nezahualcóyotl MEX 1224924
2520 Juárez MEX 1217818
2521 Tijuana MEX 1212232
2522 León MEX 1133576
2523 Monterrey MEX 1108499
2524 Zapopan MEX 1002239
2525 Naucalpan de Juárez MEX 857511
2526 Mexicali MEX 764902
2527 Culiacán MEX 744859
2528 Acapulco de Juárez MEX 721011
2529 Tlalnepantla de Baz MEX 720755
2530 Mérida MEX 703324
2690 Chisinau MDA 719900
2696 Ulan Bator MNG 773700
2698 Maputo MOZ 1018938
2710 Rangoon (Yangon) MMR 3361700
2711 Mandalay MMR 885300
SELECT * FROM City USE INDEX ()
WHERE Country='CHN' AND Population > 1000000;
ID Name Country Population
1890 Shanghai CHN 9696300
1891 Peking CHN 7472000
1892 Chongqing CHN 6351600
1893 Tianjin CHN 5286800
1894 Wuhan CHN 4344600
1895 Harbin CHN 4289800
1896 Shenyang CHN 4265200
1897 Kanton [Guangzhou] CHN 4256300
1898 Chengdu CHN 3361500
1899 Nanking [Nanjing] CHN 2870300
1900 Changchun CHN 2812000
1901 Xi´an CHN 2761400
1902 Dalian CHN 2697000
1903 Qingdao CHN 2596000
1904 Jinan CHN 2278100
1905 Hangzhou CHN 2190500
1906 Zhengzhou CHN 2107200
1907 Shijiazhuang CHN 2041500
1908 Taiyuan CHN 1968400
1909 Kunming CHN 1829500
1910 Changsha CHN 1809800
1911 Nanchang CHN 1691600
1912 Fuzhou CHN 1593800
1913 Lanzhou CHN 1565800
1914 Guiyang CHN 1465200
1915 Ningbo CHN 1371200
1916 Hefei CHN 1369100
1917 Urumt?i [Ürümqi] CHN 1310100
1918 Anshan CHN 1200000
1919 Fushun CHN 1200000
1920 Nanning CHN 1161800
1921 Zibo CHN 1140000
1922 Qiqihar CHN 1070000
1923 Jilin CHN 1040000
1924 Tangshan CHN 1040000
SELECT * FROM City
WHERE Country='CHN' AND Population > 1000000;
ID Name Country Population
1890 Shanghai CHN 9696300
1891 Peking CHN 7472000
1892 Chongqing CHN 6351600
1893 Tianjin CHN 5286800
1894 Wuhan CHN 4344600
1895 Harbin CHN 4289800
1896 Shenyang CHN 4265200
1897 Kanton [Guangzhou] CHN 4256300
1898 Chengdu CHN 3361500
1899 Nanking [Nanjing] CHN 2870300
1900 Changchun CHN 2812000
1901 Xi´an CHN 2761400
1902 Dalian CHN 2697000
1903 Qingdao CHN 2596000
1904 Jinan CHN 2278100
1905 Hangzhou CHN 2190500
1906 Zhengzhou CHN 2107200
1907 Shijiazhuang CHN 2041500
1908 Taiyuan CHN 1968400
1909 Kunming CHN 1829500
1910 Changsha CHN 1809800
1911 Nanchang CHN 1691600
1912 Fuzhou CHN 1593800
1913 Lanzhou CHN 1565800
1914 Guiyang CHN 1465200
1915 Ningbo CHN 1371200
1916 Hefei CHN 1369100
1917 Urumt?i [Ürümqi] CHN 1310100
1918 Anshan CHN 1200000
1919 Fushun CHN 1200000
1920 Nanning CHN 1161800
1921 Zibo CHN 1140000
1922 Qiqihar CHN 1070000
1923 Jilin CHN 1040000
1924 Tangshan CHN 1040000
SELECT * FROM City USE INDEX ()
WHERE Country='CHN' AND Population > 1000000 AND Name LIKE 'C%';
ID Name Country Population
1892 Chongqing CHN 6351600
1898 Chengdu CHN 3361500
1900 Changchun CHN 2812000
1910 Changsha CHN 1809800
SELECT * FROM City
WHERE Country='CHN' AND Population > 1000000 AND Name LIKE 'C%';
ID Name Country Population
1892 Chongqing CHN 6351600
1898 Chengdu CHN 3361500
1900 Changchun CHN 2812000
1910 Changsha CHN 1809800
DROP DATABASE world;
use test;
SET SESSION optimizer_switch='index_merge_sort_intersection=on';
SET SESSION STORAGE_ENGINE=DEFAULT;

View File

@ -1,3 +1,5 @@
set @optimizer_switch_save= @@optimizer_switch;
set optimizer_switch='index_merge_sort_intersection=off';
#---------------- Index merge test 2 -------------------------------------------
SET SESSION STORAGE_ENGINE = InnoDB;
drop table if exists t1,t2;
@ -636,3 +638,4 @@ WHERE a BETWEEN 2 AND 7 OR pk=1000000) AS t;
COUNT(*)
6145
DROP TABLE t1;
set optimizer_switch= @optimizer_switch_save;

View File

@ -1,3 +1,5 @@
set @optimizer_switch_save= @@optimizer_switch;
set optimizer_switch='index_merge_sort_intersection=off';
#---------------- Index merge test 1 -------------------------------------------
SET SESSION STORAGE_ENGINE = MyISAM;
drop table if exists t0, t1, t2, t3, t4;
@ -205,10 +207,10 @@ id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t2 index_merge i1_3,i2_3 i1_3,i2_3 4,4 NULL 2 Using sort_union(i1_3,i2_3); Using where
explain select key3 from t2 where key1 <100 or key2 < 100;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t2 index i1_3,i2_3 i321 12 NULL 1024 Using where; Using index
1 SIMPLE t2 index_merge i1_3,i2_3 i1_3,i2_3 4,4 NULL 188 Using sort_union(i1_3,i2_3); Using where
explain select key7 from t2 where key1 <100 or key2 < 100;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t2 ALL i1_3,i2_3 NULL NULL NULL 1024 Using where
1 SIMPLE t2 index_merge i1_3,i2_3 i1_3,i2_3 4,4 NULL 188 Using sort_union(i1_3,i2_3); Using where
create table t4 (
key1a int not null,
key1b int not null,
@ -569,9 +571,7 @@ INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
INSERT INTO t1 SELECT * FROM t1;
SET SESSION sort_buffer_size=1;
Warnings:
Warning 1292 Truncated incorrect sort_buffer_size value: '1'
SET SESSION sort_buffer_size=1024*8;
EXPLAIN
SELECT * FROM t1 FORCE INDEX(a,b) WHERE a LIKE 'a%' OR b LIKE 'b%'
ORDER BY a,b;
@ -1421,19 +1421,19 @@ drop table t1;
#
select @@optimizer_switch;
@@optimizer_switch
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off
set optimizer_switch='index_merge=off,index_merge_union=off';
select @@optimizer_switch;
@@optimizer_switch
index_merge=off,index_merge_union=off,index_merge_sort_union=on,index_merge_intersection=on
index_merge=off,index_merge_union=off,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off
set optimizer_switch='index_merge_union=on';
select @@optimizer_switch;
@@optimizer_switch
index_merge=off,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on
index_merge=off,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off
set optimizer_switch='default,index_merge_sort_union=off';
select @@optimizer_switch;
@@optimizer_switch
index_merge=on,index_merge_union=on,index_merge_sort_union=off,index_merge_intersection=on
index_merge=on,index_merge_union=on,index_merge_sort_union=off,index_merge_intersection=on,index_merge_sort_intersection=on
set optimizer_switch=4;
ERROR 42000: Variable 'optimizer_switch' can't be set to the value of '4'
set optimizer_switch=NULL;
@ -1460,21 +1460,21 @@ set optimizer_switch=default;
set optimizer_switch='index_merge=off,index_merge_union=off,default';
select @@optimizer_switch;
@@optimizer_switch
index_merge=off,index_merge_union=off,index_merge_sort_union=on,index_merge_intersection=on
index_merge=off,index_merge_union=off,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=on
set optimizer_switch=default;
select @@global.optimizer_switch;
@@global.optimizer_switch
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=on
set @@global.optimizer_switch=default;
select @@global.optimizer_switch;
@@global.optimizer_switch
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=on
#
# Check index_merge's @@optimizer_switch flags
#
select @@optimizer_switch;
@@optimizer_switch
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=on
create table t0 (a int);
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
create table t1 (a int, b int, c int, filler char(100),
@ -1551,7 +1551,7 @@ explain select * from t1 where a=10 and b=10;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ref a,b a 5 const 49 Using where
No intersect if it is disabled:
set optimizer_switch='default,index_merge_intersection=off';
set optimizer_switch='default,index_merge_sort_intersection=off,index_merge_intersection=off';
explain select * from t1 where a=10 and b=10;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ref a,b a 5 const 49 Using where
@ -1584,5 +1584,6 @@ id select_type table type possible_keys key key_len ref rows Extra
set optimizer_switch=default;
show variables like 'optimizer_switch';
Variable_name Value
optimizer_switch index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on
optimizer_switch index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=on
drop table t0, t1;
set optimizer_switch= @optimizer_switch_save;

View File

@ -1421,9 +1421,9 @@ DROP TABLE t1;
#
create table t1(a int, b tinytext);
insert into t1 values (1,2),(3,2);
set session sort_buffer_size= 30000;
set session sort_buffer_size= 1000;
Warnings:
Warning 1292 Truncated incorrect sort_buffer_size value: '30000'
Warning 1292 Truncated incorrect sort_buffer_size value: '1000'
set session max_sort_length= 2180;
select * from t1 order by b;
ERROR HY001: Out of sort memory; increase server sort buffer size

View File

@ -38,6 +38,7 @@ SELECT COUNT(*) FROM CountryLanguage;
COUNT(*)
984
CREATE INDEX Name ON City(Name);
set session optimizer_switch='index_merge_sort_intersection=off';
EXPLAIN
SELECT * FROM City
WHERE (Population >= 100000 OR Name LIKE 'P%' OR Population < 100000);
@ -71,9 +72,9 @@ id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population Population 4 NULL 459 Using where
EXPLAIN
SELECT * FROM City
WHERE (Population > 101000 AND Population < 103000);
WHERE (Population > 101000 AND Population < 102000);
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population Population 4 NULL 81 Using where
1 SIMPLE City range Population Population 4 NULL 39 Using where
EXPLAIN
SELECT * FROM City
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F'));
@ -88,9 +89,9 @@ id select_type table type possible_keys key key_len ref rows Extra
EXPLAIN
SELECT * FROM City
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F'))
AND (Population > 101000 AND Population < 103000);
AND (Population > 101000 AND Population < 102000);
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,Country,Name Population 4 NULL 81 Using where
1 SIMPLE City range Population,Country,Name Population 4 NULL 39 Using where
SELECT * FROM City USE INDEX ()
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F'))
AND (Population > 101000 AND Population < 115000);
@ -153,24 +154,20 @@ ID Name Country Population
4032 Cambridge USA 101355
SELECT * FROM City USE INDEX ()
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F'))
AND (Population > 101000 AND Population < 103000);
AND (Population > 101000 AND Population < 102000);
ID Name Country Population
637 Mit Ghamr EGY 101801
707 Marbella ESP 101144
3411 Ceyhan TUR 102412
3792 Tartu EST 101246
4027 Cape Coral USA 102286
4032 Cambridge USA 101355
SELECT * FROM City
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F'))
AND (Population > 101000 AND Population < 103000);
AND (Population > 101000 AND Population < 102000);
ID Name Country Population
707 Marbella ESP 101144
3792 Tartu EST 101246
4032 Cambridge USA 101355
637 Mit Ghamr EGY 101801
4027 Cape Coral USA 102286
3411 Ceyhan TUR 102412
EXPLAIN
SELECT * FROM City WHERE (Name < 'Ac');
id select_type table type possible_keys key key_len ref rows Extra
@ -328,9 +325,9 @@ ID Name Country Population
1003 Pemalang IDN 103500
2663 Río Bravo MEX 103901
EXPLAIN
SELECT * FROM City WHERE (ID < 50) OR (ID BETWEEN 100 AND 110);
SELECT * FROM City WHERE (ID < 30) OR (ID BETWEEN 100 AND 150);
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range PRIMARY PRIMARY 4 NULL 61 Using where
1 SIMPLE City range PRIMARY PRIMARY 4 NULL 81 Using where
EXPLAIN
SELECT * FROM City WHERE (ID < 200) OR (ID BETWEEN 300 AND 600);
id select_type table type possible_keys key key_len ref rows Extra
@ -353,11 +350,11 @@ id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Name Name 35 NULL 72 Using where
EXPLAIN
SELECT * FROM City
WHERE ((ID < 50) AND (Name LIKE 'H%' OR (Country > 'A' AND Country < 'ARG')))
WHERE ((ID < 30) AND (Name LIKE 'H%' OR (Country > 'A' AND Country < 'ARG')))
OR ((ID BETWEEN 100 AND 110) AND
(Name LIKE 'P%' OR (Population > 103000 AND Population < 104000)));
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range PRIMARY,Population,Country,Name PRIMARY 4 NULL 61 Using where
1 SIMPLE City range PRIMARY,Population,Country,Name PRIMARY 4 NULL 41 Using where
EXPLAIN
SELECT * FROM City
WHERE ((ID < 800) AND (Name LIKE 'Ha%' OR (Country > 'A' AND Country < 'ARG')))
@ -373,7 +370,7 @@ OR ((ID BETWEEN 300 AND 600) AND
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City index_merge PRIMARY,Population,Country,Name Name,Country,Population 35,3,4 NULL 128 Using sort_union(Name,Country,Population); Using where
SELECT * FROM City USE INDEX ()
WHERE ((ID < 50) AND (Name LIKE 'H%' OR (Country > 'A' AND Country < 'ARG')))
WHERE ((ID < 30) AND (Name LIKE 'H%' OR (Country > 'A' AND Country < 'ARG')))
OR ((ID BETWEEN 100 AND 110) AND
(Name LIKE 'P%' OR (Population > 103000 AND Population < 104000)));
ID Name Country Population
@ -384,13 +381,10 @@ ID Name Country Population
7 Haag NLD 440900
16 Haarlem NLD 148772
25 Haarlemmermeer NLD 110722
31 Heerlen NLD 95052
33 Willemstad ANT 2345
34 Tirana ALB 270000
100 Paraná ARG 207041
102 Posadas ARG 201273
SELECT * FROM City
WHERE ((ID < 50) AND (Name LIKE 'H%' OR (Country > 'A' AND Country < 'ARG')))
WHERE ((ID < 30) AND (Name LIKE 'H%' OR (Country > 'A' AND Country < 'ARG')))
OR ((ID BETWEEN 100 AND 110) AND
(Name LIKE 'P%' OR (Population > 103000 AND Population < 104000)));
ID Name Country Population
@ -401,9 +395,6 @@ ID Name Country Population
7 Haag NLD 440900
16 Haarlem NLD 148772
25 Haarlemmermeer NLD 110722
31 Heerlen NLD 95052
33 Willemstad ANT 2345
34 Tirana ALB 270000
100 Paraná ARG 207041
102 Posadas ARG 201273
SELECT * FROM City USE INDEX()
@ -726,119 +717,55 @@ SELECT * FROM City WHERE Name LIKE 'P%';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Name Name 35 NULL 135 Using where
EXPLAIN
SELECT * FROM City WHERE (Population > 101000 AND Population < 103000);
SELECT * FROM City WHERE (Population > 101000 AND Population < 102000);
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population Population 4 NULL 81 Using where
1 SIMPLE City range Population Population 4 NULL 39 Using where
EXPLAIN
SELECT * FROM City WHERE Country='USA';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City ref Country,CountryPopulation Country 3 const 267 Using where
EXPLAIN
SELECT * FROM City
WHERE ((Population > 101000 AND Population < 103000) OR Name LIKE 'Pas%')
WHERE ((Population > 101000 AND Population < 102000) OR Name LIKE 'Pas%')
AND Country='USA';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City index_merge Population,Country,Name,CountryPopulation CountryPopulation,Name 7,35 NULL 15 Using sort_union(CountryPopulation,Name); Using where
1 SIMPLE City index_merge Population,Country,Name,CountryPopulation CountryPopulation,Name 7,35 NULL 8 Using sort_union(CountryPopulation,Name); Using where
EXPLAIN
SELECT * FROM City
WHERE ((Population > 101000 AND Population < 103000) OR Name LIKE 'P%')
AND Country='USA';
WHERE ((Population > 101000 AND Population < 1000000) OR Name LIKE 'P%' )
AND Country='USA' AND Name LIKE '%port';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City ref Population,Country,Name,CountryPopulation Country 3 const 267 Using where
SELECT * FROM City
WHERE ((Population > 101000 AND Population < 103000) OR Name LIKE 'Pas%')
WHERE ((Population > 101000 AND Population < 102000) OR Name LIKE 'Pas%')
AND Country='USA';
ID Name Country Population
3943 Pasadena USA 141674
3953 Pasadena USA 133936
4023 Gary USA 102746
4024 Berkeley USA 102743
4025 Santa Clara USA 102361
4026 Green Bay USA 102313
4027 Cape Coral USA 102286
4028 Arvada USA 102153
4029 Pueblo USA 102121
4030 Sandy USA 101853
4031 Athens-Clarke County USA 101489
4032 Cambridge USA 101355
SELECT * FROM City USE INDEX ()
WHERE ((Population > 101000 AND Population < 103000) OR Name LIKE 'Pas%')
WHERE ((Population > 101000 AND Population < 102000) OR Name LIKE 'Pas%')
AND Country='USA';
ID Name Country Population
3943 Pasadena USA 141674
3953 Pasadena USA 133936
4023 Gary USA 102746
4024 Berkeley USA 102743
4025 Santa Clara USA 102361
4026 Green Bay USA 102313
4027 Cape Coral USA 102286
4028 Arvada USA 102153
4029 Pueblo USA 102121
4030 Sandy USA 101853
4031 Athens-Clarke County USA 101489
4032 Cambridge USA 101355
SELECT * FROM City
WHERE ((Population > 101000 AND Population < 103000) OR Name LIKE 'P%')
AND Country='USA';
WHERE ((Population > 101000 AND Population < 1000000) OR Name LIKE 'P%')
AND Country='USA' AND Name LIKE '%port';
ID Name Country Population
3797 Philadelphia USA 1517550
3798 Phoenix USA 1321045
3820 Portland USA 529121
3844 Pittsburgh USA 334563
3870 Plano USA 222030
3912 Providence USA 173618
3930 Pomona USA 149473
3932 Paterson USA 149222
3943 Pasadena USA 141674
3951 Pembroke Pines USA 137427
3953 Pasadena USA 133936
3967 Paradise USA 124682
3986 Palmdale USA 116670
3996 Peoria USA 112936
4007 Peoria USA 108364
4016 Provo USA 105166
4023 Gary USA 102746
4024 Berkeley USA 102743
4025 Santa Clara USA 102361
4026 Green Bay USA 102313
4027 Cape Coral USA 102286
4028 Arvada USA 102153
4029 Pueblo USA 102121
4030 Sandy USA 101853
4031 Athens-Clarke County USA 101489
4032 Cambridge USA 101355
4035 Portsmouth USA 100565
3880 Shreveport USA 200145
3946 Bridgeport USA 139529
SELECT * FROM City USE INDEX ()
WHERE ((Population > 101000 AND Population < 103000) OR Name LIKE 'P%')
AND Country='USA';
WHERE ((Population > 101000 AND Population < 1000000) OR Name LIKE 'P%')
AND Country='USA' AND Name LIKE '%port';
ID Name Country Population
3797 Philadelphia USA 1517550
3798 Phoenix USA 1321045
3820 Portland USA 529121
3844 Pittsburgh USA 334563
3870 Plano USA 222030
3912 Providence USA 173618
3930 Pomona USA 149473
3932 Paterson USA 149222
3943 Pasadena USA 141674
3951 Pembroke Pines USA 137427
3953 Pasadena USA 133936
3967 Paradise USA 124682
3986 Palmdale USA 116670
3996 Peoria USA 112936
4007 Peoria USA 108364
4016 Provo USA 105166
4023 Gary USA 102746
4024 Berkeley USA 102743
4025 Santa Clara USA 102361
4026 Green Bay USA 102313
4027 Cape Coral USA 102286
4028 Arvada USA 102153
4029 Pueblo USA 102121
4030 Sandy USA 101853
4031 Athens-Clarke County USA 101489
4032 Cambridge USA 101355
4035 Portsmouth USA 100565
3880 Shreveport USA 200145
3946 Bridgeport USA 139529
CREATE INDEX CountryName ON City(Country,Name);
EXPLAIN
SELECT * FROM City WHERE Country='USA';
@ -900,9 +827,10 @@ id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City index_merge PRIMARY,Population,Country,Name,CountryPopulation,CountryName CountryName,PRIMARY 38,4 NULL 11 Using sort_union(CountryName,PRIMARY); Using where
EXPLAIN
SELECT * FROM City
WHERE ((Population > 101000 AND Population < 110000) OR
ID BETWEEN 3500 AND 3800) AND Country='USA'
AND (Name BETWEEN 'P' AND 'T' OR ID BETWEEN 4000 AND 4300);
WHERE ((Population > 101000 AND Population < 1000000) OR
ID BETWEEN 3000 AND 3800) AND Country='USA'
AND (Name BETWEEN 'P' AND 'Z' OR ID BETWEEN 3500 AND 4300)
AND Name LIKE '%port';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City ref PRIMARY,Population,Country,Name,CountryPopulation,CountryName Country 3 const 267 Using where
SELECT * FROM City USE INDEX ()
@ -938,21 +866,21 @@ ID Name Country Population
4031 Athens-Clarke County USA 101489
4032 Cambridge USA 101355
SELECT * FROM City USE INDEX ()
WHERE ((Population > 101000 AND Population < 102000) OR
ID BETWEEN 3790 AND 3800) AND Country='USA'
AND (Name LIKE 'Pa%' OR ID BETWEEN 4025 AND 4035);
WHERE ((Population > 101000 AND Population < 1000000) OR
ID BETWEEN 3000 AND 3800) AND Country='USA'
AND (Name BETWEEN 'P' AND 'Z' OR ID BETWEEN 3500 AND 4300)
AND Name LIKE '%port';
ID Name Country Population
4030 Sandy USA 101853
4031 Athens-Clarke County USA 101489
4032 Cambridge USA 101355
3880 Shreveport USA 200145
3946 Bridgeport USA 139529
SELECT * FROM City
WHERE ((Population > 101000 AND Population < 102000) OR
ID BETWEEN 3790 AND 3800) AND Country='USA'
AND (Name LIKE 'Pa%' OR ID BETWEEN 4025 AND 4035);
WHERE ((Population > 101000 AND Population < 1000000) OR
ID BETWEEN 3000 AND 3800) AND Country='USA'
AND (Name BETWEEN 'P' AND 'Z' OR ID BETWEEN 3500 AND 4300)
AND Name LIKE '%port';
ID Name Country Population
4030 Sandy USA 101853
4031 Athens-Clarke County USA 101489
4032 Cambridge USA 101355
3880 Shreveport USA 200145
3946 Bridgeport USA 139529
EXPLAIN
SELECT * FROM City
WHERE ((Population > 101000 and Population < 102000) OR
@ -1386,3 +1314,4 @@ WHERE c = 'i' OR b IN ( 'Arkansas' , 'd' , 'pdib' , 'can' ) OR
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index_merge PRIMARY,idx1,idx2,idx3 idx3,idx2,PRIMARY,idx1 67,13,4,3 NULL 8 Using sort_union(idx3,idx2,PRIMARY,idx1); Using where
DROP TABLE t1;
set session optimizer_switch='index_merge_sort_intersection=default';

View File

@ -39,6 +39,7 @@ SELECT COUNT(*) FROM CountryLanguage;
COUNT(*)
984
CREATE INDEX Name ON City(Name);
set session optimizer_switch='index_merge_sort_intersection=off';
EXPLAIN
SELECT * FROM City
WHERE (Population >= 100000 OR Name LIKE 'P%' OR Population < 100000);
@ -72,9 +73,9 @@ id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population Population 4 NULL 458 Using where
EXPLAIN
SELECT * FROM City
WHERE (Population > 101000 AND Population < 103000);
WHERE (Population > 101000 AND Population < 102000);
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population Population 4 NULL 80 Using where
1 SIMPLE City range Population Population 4 NULL 38 Using where
EXPLAIN
SELECT * FROM City
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F'));
@ -89,9 +90,9 @@ id select_type table type possible_keys key key_len ref rows Extra
EXPLAIN
SELECT * FROM City
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F'))
AND (Population > 101000 AND Population < 103000);
AND (Population > 101000 AND Population < 102000);
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population,Country,Name Population 4 NULL 80 Using where
1 SIMPLE City range Population,Country,Name Population 4 NULL 38 Using where
SELECT * FROM City USE INDEX ()
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F'))
AND (Population > 101000 AND Population < 115000);
@ -154,24 +155,20 @@ ID Name Country Population
4032 Cambridge USA 101355
SELECT * FROM City USE INDEX ()
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F'))
AND (Population > 101000 AND Population < 103000);
AND (Population > 101000 AND Population < 102000);
ID Name Country Population
637 Mit Ghamr EGY 101801
707 Marbella ESP 101144
3411 Ceyhan TUR 102412
3792 Tartu EST 101246
4027 Cape Coral USA 102286
4032 Cambridge USA 101355
SELECT * FROM City
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F'))
AND (Population > 101000 AND Population < 103000);
AND (Population > 101000 AND Population < 102000);
ID Name Country Population
707 Marbella ESP 101144
3792 Tartu EST 101246
4032 Cambridge USA 101355
637 Mit Ghamr EGY 101801
4027 Cape Coral USA 102286
3411 Ceyhan TUR 102412
EXPLAIN
SELECT * FROM City WHERE (Name < 'Ac');
id select_type table type possible_keys key key_len ref rows Extra
@ -329,9 +326,9 @@ ID Name Country Population
1003 Pemalang IDN 103500
2663 Río Bravo MEX 103901
EXPLAIN
SELECT * FROM City WHERE (ID < 50) OR (ID BETWEEN 100 AND 110);
SELECT * FROM City WHERE (ID < 30) OR (ID BETWEEN 100 AND 150);
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range PRIMARY PRIMARY 4 NULL 60 Using where
1 SIMPLE City range PRIMARY PRIMARY 4 NULL 79 Using where
EXPLAIN
SELECT * FROM City WHERE (ID < 200) OR (ID BETWEEN 300 AND 600);
id select_type table type possible_keys key key_len ref rows Extra
@ -354,11 +351,11 @@ id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Name Name 35 NULL 133 Using where
EXPLAIN
SELECT * FROM City
WHERE ((ID < 50) AND (Name LIKE 'H%' OR (Country > 'A' AND Country < 'ARG')))
WHERE ((ID < 30) AND (Name LIKE 'H%' OR (Country > 'A' AND Country < 'ARG')))
OR ((ID BETWEEN 100 AND 110) AND
(Name LIKE 'P%' OR (Population > 103000 AND Population < 104000)));
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range PRIMARY,Population,Country,Name PRIMARY 4 NULL 60 Using where
1 SIMPLE City range PRIMARY,Population,Country,Name PRIMARY 4 NULL 40 Using where
EXPLAIN
SELECT * FROM City
WHERE ((ID < 800) AND (Name LIKE 'Ha%' OR (Country > 'A' AND Country < 'ARG')))
@ -372,9 +369,9 @@ WHERE ((ID < 600) AND (Name LIKE 'Ha%' OR (Country > 'A' AND Country < 'ARG')))
OR ((ID BETWEEN 300 AND 600) AND
(Name LIKE 'Pa%' OR (Population > 103000 AND Population < 104000)));
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range PRIMARY,Population,Country,Name PRIMARY 4 NULL 1242 Using where
1 SIMPLE City index_merge PRIMARY,Population,Country,Name Name,Country,Population 35,3,4 NULL 188 Using sort_union(Name,Country,Population); Using where
SELECT * FROM City USE INDEX ()
WHERE ((ID < 50) AND (Name LIKE 'H%' OR (Country > 'A' AND Country < 'ARG')))
WHERE ((ID < 30) AND (Name LIKE 'H%' OR (Country > 'A' AND Country < 'ARG')))
OR ((ID BETWEEN 100 AND 110) AND
(Name LIKE 'P%' OR (Population > 103000 AND Population < 104000)));
ID Name Country Population
@ -385,13 +382,10 @@ ID Name Country Population
7 Haag NLD 440900
16 Haarlem NLD 148772
25 Haarlemmermeer NLD 110722
31 Heerlen NLD 95052
33 Willemstad ANT 2345
34 Tirana ALB 270000
100 Paraná ARG 207041
102 Posadas ARG 201273
SELECT * FROM City
WHERE ((ID < 50) AND (Name LIKE 'H%' OR (Country > 'A' AND Country < 'ARG')))
WHERE ((ID < 30) AND (Name LIKE 'H%' OR (Country > 'A' AND Country < 'ARG')))
OR ((ID BETWEEN 100 AND 110) AND
(Name LIKE 'P%' OR (Population > 103000 AND Population < 104000)));
ID Name Country Population
@ -402,9 +396,6 @@ ID Name Country Population
7 Haag NLD 440900
16 Haarlem NLD 148772
25 Haarlemmermeer NLD 110722
31 Heerlen NLD 95052
33 Willemstad ANT 2345
34 Tirana ALB 270000
100 Paraná ARG 207041
102 Posadas ARG 201273
SELECT * FROM City USE INDEX()
@ -577,6 +568,20 @@ WHERE ((ID < 200) AND (Name LIKE 'Ha%' OR (Country > 'A' AND Country < 'ARG')))
OR ((ID BETWEEN 300 AND 600) AND
(Name LIKE 'Pa%' OR (Population > 103000 AND Population < 104000)));
ID Name Country Population
339 Passo Fundo BRA 166343
364 Parnaíba BRA 129756
372 Paranaguá BRA 126076
379 Palmas BRA 121919
386 Patos de Minas BRA 119262
411 Guaratinguetá BRA 103433
412 Cachoeirinha BRA 103240
413 Codó BRA 103153
424 Passos BRA 98570
430 Paulo Afonso BRA 97291
435 Parnamirim BRA 96210
448 Patos BRA 90519
451 Palhoça BRA 89465
517 Oldham GBR 103931
1 Kabul AFG 1780000
2 Qandahar AFG 237500
3 Herat AFG 186800
@ -601,20 +606,6 @@ ID Name Country Population
68 Ajman ARE 114395
129 Oranjestad ABW 29034
191 Hamilton BMU 1200
339 Passo Fundo BRA 166343
364 Parnaíba BRA 129756
372 Paranaguá BRA 126076
379 Palmas BRA 121919
386 Patos de Minas BRA 119262
411 Guaratinguetá BRA 103433
412 Cachoeirinha BRA 103240
413 Codó BRA 103153
424 Passos BRA 98570
430 Paulo Afonso BRA 97291
435 Parnamirim BRA 96210
448 Patos BRA 90519
451 Palhoça BRA 89465
517 Oldham GBR 103931
EXPLAIN
SELECT * FROM City WHERE Population > 101000 AND Population < 102000;
id select_type table type possible_keys key key_len ref rows Extra
@ -727,119 +718,55 @@ SELECT * FROM City WHERE Name LIKE 'P%';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Name Name 35 NULL 235 Using where
EXPLAIN
SELECT * FROM City WHERE (Population > 101000 AND Population < 103000);
SELECT * FROM City WHERE (Population > 101000 AND Population < 102000);
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City range Population Population 4 NULL 80 Using where
1 SIMPLE City range Population Population 4 NULL 38 Using where
EXPLAIN
SELECT * FROM City WHERE Country='USA';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City ref Country,CountryPopulation Country 3 const 274 Using where
EXPLAIN
SELECT * FROM City
WHERE ((Population > 101000 AND Population < 103000) OR Name LIKE 'Pas%')
WHERE ((Population > 101000 AND Population < 102000) OR Name LIKE 'Pas%')
AND Country='USA';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City index_merge Population,Country,Name,CountryPopulation CountryPopulation,Name 7,35 NULL 17 Using sort_union(CountryPopulation,Name); Using where
1 SIMPLE City index_merge Population,Country,Name,CountryPopulation CountryPopulation,Name 7,35 NULL 10 Using sort_union(CountryPopulation,Name); Using where
EXPLAIN
SELECT * FROM City
WHERE ((Population > 101000 AND Population < 103000) OR Name LIKE 'P%')
AND Country='USA';
WHERE ((Population > 101000 AND Population < 1000000) OR Name LIKE 'P%' )
AND Country='USA' AND Name LIKE '%port';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City ref Population,Country,Name,CountryPopulation Country 3 const 274 Using where
SELECT * FROM City
WHERE ((Population > 101000 AND Population < 103000) OR Name LIKE 'Pas%')
WHERE ((Population > 101000 AND Population < 102000) OR Name LIKE 'Pas%')
AND Country='USA';
ID Name Country Population
3943 Pasadena USA 141674
3953 Pasadena USA 133936
4023 Gary USA 102746
4024 Berkeley USA 102743
4025 Santa Clara USA 102361
4026 Green Bay USA 102313
4027 Cape Coral USA 102286
4028 Arvada USA 102153
4029 Pueblo USA 102121
4030 Sandy USA 101853
4031 Athens-Clarke County USA 101489
4032 Cambridge USA 101355
SELECT * FROM City USE INDEX ()
WHERE ((Population > 101000 AND Population < 103000) OR Name LIKE 'Pas%')
WHERE ((Population > 101000 AND Population < 102000) OR Name LIKE 'Pas%')
AND Country='USA';
ID Name Country Population
3943 Pasadena USA 141674
3953 Pasadena USA 133936
4023 Gary USA 102746
4024 Berkeley USA 102743
4025 Santa Clara USA 102361
4026 Green Bay USA 102313
4027 Cape Coral USA 102286
4028 Arvada USA 102153
4029 Pueblo USA 102121
4030 Sandy USA 101853
4031 Athens-Clarke County USA 101489
4032 Cambridge USA 101355
SELECT * FROM City
WHERE ((Population > 101000 AND Population < 103000) OR Name LIKE 'P%')
AND Country='USA';
WHERE ((Population > 101000 AND Population < 1000000) OR Name LIKE 'P%')
AND Country='USA' AND Name LIKE '%port';
ID Name Country Population
3797 Philadelphia USA 1517550
3798 Phoenix USA 1321045
3820 Portland USA 529121
3844 Pittsburgh USA 334563
3870 Plano USA 222030
3912 Providence USA 173618
3930 Pomona USA 149473
3932 Paterson USA 149222
3943 Pasadena USA 141674
3951 Pembroke Pines USA 137427
3953 Pasadena USA 133936
3967 Paradise USA 124682
3986 Palmdale USA 116670
3996 Peoria USA 112936
4007 Peoria USA 108364
4016 Provo USA 105166
4023 Gary USA 102746
4024 Berkeley USA 102743
4025 Santa Clara USA 102361
4026 Green Bay USA 102313
4027 Cape Coral USA 102286
4028 Arvada USA 102153
4029 Pueblo USA 102121
4030 Sandy USA 101853
4031 Athens-Clarke County USA 101489
4032 Cambridge USA 101355
4035 Portsmouth USA 100565
3880 Shreveport USA 200145
3946 Bridgeport USA 139529
SELECT * FROM City USE INDEX ()
WHERE ((Population > 101000 AND Population < 103000) OR Name LIKE 'P%')
AND Country='USA';
WHERE ((Population > 101000 AND Population < 1000000) OR Name LIKE 'P%')
AND Country='USA' AND Name LIKE '%port';
ID Name Country Population
3797 Philadelphia USA 1517550
3798 Phoenix USA 1321045
3820 Portland USA 529121
3844 Pittsburgh USA 334563
3870 Plano USA 222030
3912 Providence USA 173618
3930 Pomona USA 149473
3932 Paterson USA 149222
3943 Pasadena USA 141674
3951 Pembroke Pines USA 137427
3953 Pasadena USA 133936
3967 Paradise USA 124682
3986 Palmdale USA 116670
3996 Peoria USA 112936
4007 Peoria USA 108364
4016 Provo USA 105166
4023 Gary USA 102746
4024 Berkeley USA 102743
4025 Santa Clara USA 102361
4026 Green Bay USA 102313
4027 Cape Coral USA 102286
4028 Arvada USA 102153
4029 Pueblo USA 102121
4030 Sandy USA 101853
4031 Athens-Clarke County USA 101489
4032 Cambridge USA 101355
4035 Portsmouth USA 100565
3880 Shreveport USA 200145
3946 Bridgeport USA 139529
CREATE INDEX CountryName ON City(Country,Name);
EXPLAIN
SELECT * FROM City WHERE Country='USA';
@ -901,9 +828,10 @@ id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City index_merge PRIMARY,Population,Country,Name,CountryPopulation,CountryName CountryName,PRIMARY 38,4 NULL 10 Using sort_union(CountryName,PRIMARY); Using where
EXPLAIN
SELECT * FROM City
WHERE ((Population > 101000 AND Population < 110000) OR
ID BETWEEN 3500 AND 3800) AND Country='USA'
AND (Name BETWEEN 'P' AND 'T' OR ID BETWEEN 4000 AND 4300);
WHERE ((Population > 101000 AND Population < 1000000) OR
ID BETWEEN 3000 AND 3800) AND Country='USA'
AND (Name BETWEEN 'P' AND 'Z' OR ID BETWEEN 3500 AND 4300)
AND Name LIKE '%port';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City ref PRIMARY,Population,Country,Name,CountryPopulation,CountryName Country 3 const 274 Using where
SELECT * FROM City USE INDEX ()
@ -939,21 +867,21 @@ ID Name Country Population
4031 Athens-Clarke County USA 101489
4032 Cambridge USA 101355
SELECT * FROM City USE INDEX ()
WHERE ((Population > 101000 AND Population < 102000) OR
ID BETWEEN 3790 AND 3800) AND Country='USA'
AND (Name LIKE 'Pa%' OR ID BETWEEN 4025 AND 4035);
WHERE ((Population > 101000 AND Population < 1000000) OR
ID BETWEEN 3000 AND 3800) AND Country='USA'
AND (Name BETWEEN 'P' AND 'Z' OR ID BETWEEN 3500 AND 4300)
AND Name LIKE '%port';
ID Name Country Population
4030 Sandy USA 101853
4031 Athens-Clarke County USA 101489
4032 Cambridge USA 101355
3880 Shreveport USA 200145
3946 Bridgeport USA 139529
SELECT * FROM City
WHERE ((Population > 101000 AND Population < 102000) OR
ID BETWEEN 3790 AND 3800) AND Country='USA'
AND (Name LIKE 'Pa%' OR ID BETWEEN 4025 AND 4035);
WHERE ((Population > 101000 AND Population < 1000000) OR
ID BETWEEN 3000 AND 3800) AND Country='USA'
AND (Name BETWEEN 'P' AND 'Z' OR ID BETWEEN 3500 AND 4300)
AND Name LIKE '%port';
ID Name Country Population
4030 Sandy USA 101853
4031 Athens-Clarke County USA 101489
4032 Cambridge USA 101355
3880 Shreveport USA 200145
3946 Bridgeport USA 139529
EXPLAIN
SELECT * FROM City
WHERE ((Population > 101000 and Population < 102000) OR
@ -1387,4 +1315,5 @@ WHERE c = 'i' OR b IN ( 'Arkansas' , 'd' , 'pdib' , 'can' ) OR
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index_merge PRIMARY,idx1,idx2,idx3 idx3,idx2,idx1,PRIMARY 67,13,3,4 NULL 9 Using sort_union(idx3,idx2,idx1,PRIMARY); Using where
DROP TABLE t1;
set session optimizer_switch='index_merge_sort_intersection=default';
SET SESSION STORAGE_ENGINE=DEFAULT;

View File

@ -3667,8 +3667,6 @@ CREATE TABLE t1 (a int, b int auto_increment, PRIMARY KEY (b));
CREATE TABLE t2 (x int auto_increment, y int, z int,
PRIMARY KEY (x), FOREIGN KEY (y) REFERENCES t1 (b));
SET SESSION sort_buffer_size = 32 * 1024;
Warnings:
Warning 1292 Truncated incorrect sort_buffer_size value: '32768'
SELECT SQL_NO_CACHE COUNT(*)
FROM (SELECT a, b, (SELECT x FROM t2 WHERE y=b ORDER BY z DESC LIMIT 1) c
FROM t1) t;
@ -4104,8 +4102,6 @@ INSERT INTO `t1` VALUES ('asdf','2007-02-08 01:11:26');
INSERT INTO `t2` VALUES ('abcdefghijk');
INSERT INTO `t2` VALUES ('asdf');
SET session sort_buffer_size=8192;
Warnings:
Warning 1292 Truncated incorrect sort_buffer_size value: '8192'
SELECT (SELECT 1 FROM t1 WHERE t1.a=t2.a ORDER BY t1.b LIMIT 1) AS d1 FROM t2;
d1
1

View File

@ -971,6 +971,7 @@ tmpdir #
select * from information_schema.session_variables where variable_name like 'tmpdir';
VARIABLE_NAME VARIABLE_VALUE
TMPDIR #
set sort_buffer_size=1024*8;
select @@ssl_ca, @@ssl_capath, @@ssl_cert, @@ssl_cipher, @@ssl_key;
@@ssl_ca @@ssl_capath @@ssl_cert @@ssl_cipher @@ssl_key
# # # # #

View File

@ -0,0 +1,385 @@
--disable_warnings
DROP TABLE IF EXISTS t1,t2,t3,t4;
DROP DATABASE IF EXISTS world;
--enable_warnings
set names utf8;
CREATE DATABASE world;
use world;
--source include/world_schema.inc
--disable_query_log
--disable_result_log
--disable_warnings
--source include/world.inc
--enable_warnings
--enable_result_log
--enable_query_log
SELECT COUNT(*) FROM Country;
SELECT COUNT(*) FROM City;
SELECT COUNT(*) FROM CountryLanguage;
CREATE INDEX Name ON City(Name);
--disable_query_log
--disable_result_log
--disable_warnings
ANALYZE TABLE City;
--enable_warnings
--enable_result_log
--enable_query_log
SET SESSION optimizer_switch='index_merge_sort_intersection=on';
SELECT COUNT(*) FROM City;
# The output of the next 6 queries tells us about selectivities
# of the conditions utilized in 4 queries following after them
SELECT COUNT(*) FROM City WHERE Name LIKE 'C%';
SELECT COUNT(*) FROM City WHERE Name LIKE 'M%';
SELECT COUNT(*) FROM City WHERE Population > 1000000;
SELECT COUNT(*) FROM City WHERE Population > 500000;
SELECT COUNT(*) FROM City WHERE Population > 300000;
SELECT COUNT(*) FROM City WHERE Population > 5000000;
# The pattern of the WHERE condition used in the following 4 queries is
# range(key1) AND range(key2)
# Varying values of the constants in the conjuncts of the condition
# we can get either an index intersection retrieval over key1 and key2
# or a range index scan for one of these indexes
EXPLAIN
SELECT * FROM City WHERE
Name LIKE 'C%' AND Population > 1000000;
EXPLAIN
SELECT * FROM City WHERE
Name LIKE 'M%' AND Population > 500000;
EXPLAIN
SELECT * FROM City
WHERE Name LIKE 'M%' AND Population > 300000;
EXPLAIN
SELECT * FROM City
WHERE Name LIKE 'M%' AND Population > 5000000;
# The following 8 queries check that
# the previous 4 plans are valid and return
# the correct results when executed
SELECT * FROM City USE INDEX ()
WHERE Name LIKE 'C%' AND Population > 1000000;
SELECT * FROM City
WHERE Name LIKE 'C%' AND Population > 1000000;
SELECT * FROM City USE INDEX ()
WHERE Name LIKE 'M%' AND Population > 500000;
SELECT * FROM City
WHERE Name LIKE 'M%' AND Population > 500000;
SELECT * FROM City USE INDEX ()
WHERE Name LIKE 'M%' AND Population > 300000;
SELECT * FROM City
WHERE Name LIKE 'M%' AND Population > 300000;
SELECT * FROM City USE INDEX ()
WHERE Name LIKE 'M%' AND Population > 5000000;
SELECT * FROM City
WHERE Name LIKE 'M%' AND Population > 5000000;
# The output of the next 7 queries tells us about selectivities
# of the conditions utilized in 3 queries following after them
SELECT COUNT(*) FROM City WHERE Name BETWEEN 'M' AND 'N';
SELECT COUNT(*) FROM City WHERE Name BETWEEN 'G' AND 'J';
SELECT COUNT(*) FROM City WHERE Population > 1000000;
SELECT COUNT(*) FROM City WHERE Population > 700000;
SELECT COUNT(*) FROM City WHERE Population > 500000;
SELECT COUNT(*) FROM City WHERE Country LIKE 'C%';
SELECT COUNT(*) FROM City WHERE Country LIKE 'L%';
# The pattern of the WHERE condition used in the following 3 queries is
# range(key1) AND range(key2) AND range(key3)
# Varying values of the constants in the conjuncts of the condition
# we can get index intersection over different pairs of keys:
# over(key1,key2), over(key1,key3) and over(key2,key3)
EXPLAIN
SELECT * FROM City
WHERE Name BETWEEN 'M' AND 'N' AND Population > 1000000 AND Country LIKE 'C%';
EXPLAIN
SELECT * FROM City
WHERE Name BETWEEN 'G' AND 'J' AND Population > 700000 AND Country LIKE 'L%';
EXPLAIN
SELECT * FROM City
WHERE Name BETWEEN 'G' AND 'J' AND Population > 500000 AND Country LIKE 'C%';
# The following 6 queries check that
# the previous 3 plans are valid and return
# the correct results when executed
SELECT * FROM City USE INDEX ()
WHERE Name BETWEEN 'M' AND 'N' AND Population > 1000000 AND Country LIKE 'C%';
SELECT * FROM City
WHERE Name BETWEEN 'M' AND 'N' AND Population > 1000000 AND Country LIKE 'C%';
SELECT * FROM City USE INDEX ()
WHERE Name BETWEEN 'G' AND 'J' AND Population > 700000 AND Country LIKE 'M%';
SELECT * FROM City
WHERE Name BETWEEN 'G' AND 'J' AND Population > 700000 AND Country LIKE 'M%';
SELECT * FROM City USE INDEX ()
WHERE Name BETWEEN 'G' AND 'J' AND Population > 500000 AND Country LIKE 'C%';
SELECT * FROM City
WHERE Name BETWEEN 'G' AND 'J' AND Population > 500000 AND Country LIKE 'C%';
# The output of the next 9 queries tells us about selectivities
# of the conditions utilized in 5 queries following after them
SELECT COUNT(*) FROM City WHERE ID BETWEEN 500 AND 999;
SELECT COUNT(*) FROM City WHERE ID BETWEEN 3500 AND 3999;
SELECT COUNT(*) FROM City WHERE ID BETWEEN 1 AND 1000;
SELECT COUNT(*) FROM City WHERE Population > 700000;
SELECT COUNT(*) FROM City WHERE Population > 1000000;
SELECT COUNT(*) FROM City WHERE Population > 300000;
SELECT COUNT(*) FROM City WHERE Country LIKE 'C%';
SELECT COUNT(*) FROM City WHERE Country LIKE 'A%';
SELECT COUNT(*) FROM City WHERE Country BETWEEN 'S' AND 'Z';
# The pattern of the WHERE condition used in the following 5 queries is
# range(key1) AND range(key2) AND range(key3)
# with key1 happens to be a primary key (it matters only for InnoDB)
# Varying values of the constants in the conjuncts of the condition
# we can get index intersection either over all three keys, or over
# different pairs, or a range sacn over one of these keys.
# Bear in mind that the condition (Country LIKE 'A%') is actually
# equivalent to the condition (Country BETWEEN 'A' AND 'B') for the
# tested instance the table City.
EXPLAIN
SELECT * FROM City
WHERE ID BETWEEN 500 AND 999 AND Population > 700000 AND Country LIKE 'C%';
EXPLAIN
SELECT * FROM City
WHERE ID BETWEEN 500 AND 999 AND Population > 1000000 AND Country LIKE 'A%';
EXPLAIN
SELECT * FROM City
WHERE ID BETWEEN 500 AND 999 AND Population > 300000 AND Country LIKE 'C%';
EXPLAIN
SELECT * FROM City
WHERE ID BETWEEN 3500 AND 3999 AND Population > 700000
AND Country BETWEEN 'S' AND 'Z';
EXPLAIN
SELECT * FROM City
WHERE ID BETWEEN 1 AND 1000 AND Population > 700000
AND Country BETWEEN 'S' AND 'Z' ;
# The following 10 queries check that
# the previous 5 plans are valid and return
# the correct results when executed
SELECT * FROM City USE INDEX ()
WHERE ID BETWEEN 500 AND 999 AND Population > 700000 AND Country LIKE 'C%';
SELECT * FROM City
WHERE ID BETWEEN 500 AND 999 AND Population > 700000 AND Country LIKE 'C%';
SELECT * FROM City USE INDEX ()
WHERE ID BETWEEN 500 AND 999 AND Population > 1000000 AND Country LIKE 'A%';
SELECT * FROM City
WHERE ID BETWEEN 500 AND 999 AND Population > 1000000 AND Country LIKE 'A%';
SELECT * FROM City USE INDEX ()
WHERE ID BETWEEN 500 AND 999 AND Population > 300000 AND Country LIKE 'C%';
SELECT * FROM City
WHERE ID BETWEEN 500 AND 999 AND Population > 300000 AND Country LIKE 'C%';
SELECT * FROM City USE INDEX ()
WHERE ID BETWEEN 3500 AND 3999 AND Population > 700000
AND Country BETWEEN 'S' AND 'Z';
SELECT * FROM City
WHERE ID BETWEEN 3500 AND 3999 AND Population > 700000
AND Country BETWEEN 'S' AND 'Z';
SELECT * FROM City USE INDEX ()
WHERE ID BETWEEN 1 AND 1000 AND Population > 700000
AND Country BETWEEN 'S' AND 'Z' ;
SELECT * FROM City
WHERE ID BETWEEN 1 AND 1000 AND Population > 700000
AND Country BETWEEN 'S' AND 'Z' ;
SET SESSION sort_buffer_size = 2048;
# The following EXPLAIN command demonstrate that the execution plans
# may be different if sort_buffer_size is set to a small value
EXPLAIN
SELECT * FROM City WHERE
Name LIKE 'C%' AND Population > 1000000;
EXPLAIN
SELECT * FROM City WHERE
Name LIKE 'M%' AND Population > 500000;
EXPLAIN
SELECT * FROM City
WHERE Name LIKE 'C%' AND Population > 1000000 AND Country LIKE 'C%';
EXPLAIN
SELECT * FROM City
WHERE Name BETWEEN 'G' AND 'J' AND Population > 700000 AND Country LIKE 'M%';
EXPLAIN
SELECT * FROM City
WHERE Name BETWEEN 'G' AND 'J' AND Population > 500000 AND Country LIKE 'C%';
EXPLAIN
SELECT * FROM City
WHERE ID BETWEEN 500 AND 999 AND Population > 1000000 AND Country LIKE 'A%';
EXPLAIN
SELECT * FROM City
WHERE ID < 1000 AND Population > 700000 AND Country LIKE 'C%';
#Yet the query themselves return the correct results in this case as well
SELECT * FROM City WHERE
Name LIKE 'C%' AND Population > 1000000;
SELECT * FROM City WHERE
Name LIKE 'M%' AND Population > 500000;
SELECT * FROM City
WHERE Name BETWEEN 'M' AND 'N' AND Population > 1000000 AND Country LIKE 'C%';
SELECT * FROM City
WHERE Name BETWEEN 'G' AND 'J' AND Population > 700000 AND Country LIKE 'M%';
SELECT * FROM City
WHERE Name BETWEEN 'G' AND 'J' AND Population > 500000 AND Country LIKE 'C%';
SELECT * FROM City
WHERE ID BETWEEN 500 AND 999 AND Population > 1000000 AND Country LIKE 'A%';
SELECT * FROM City
WHERE ID < 1000 AND Population > 700000 AND Country LIKE 'C%';
SET SESSION sort_buffer_size = default;
# Instead of the index on the column Country create two compound indexes
# including this column as the first component
DROP INDEX Country ON City;
CREATE INDEX CountryID ON City(Country,ID);
CREATE INDEX CountryName ON City(Country,Name);
--disable_query_log
--disable_result_log
--disable_warnings
ANALYZE TABLE City;
--enable_warnings
--enable_result_log
--enable_query_log
# Check that the first component of a compound index can be used for
# index intersection, even in the cases when we have a ref access
# for this component
EXPLAIN
SELECT * FROM City
WHERE Country LIKE 'M%' AND Population > 700000;
EXPLAIN
SELECT * FROM City
WHERE Country='CHN' AND Population > 1000000;
EXPLAIN
SELECT * FROM City
WHERE Country='CHN' AND Population > 1000000 AND Name LIKE 'C%';
# Check that the previous 3 plans return the right results when executed
SELECT * FROM City USE INDEX ()
WHERE Country LIKE 'M%' AND Population > 700000;
SELECT * FROM City
WHERE Country LIKE 'M%' AND Population > 700000;
SELECT * FROM City USE INDEX ()
WHERE Country='CHN' AND Population > 1000000;
SELECT * FROM City
WHERE Country='CHN' AND Population > 1000000;
SELECT * FROM City USE INDEX ()
WHERE Country='CHN' AND Population > 1000000 AND Name LIKE 'C%';
SELECT * FROM City
WHERE Country='CHN' AND Population > 1000000 AND Name LIKE 'C%';
DROP DATABASE world;
use test;
SET SESSION optimizer_switch='index_merge_sort_intersection=on';

View File

@ -0,0 +1,7 @@
--source include/have_innodb.inc
SET SESSION STORAGE_ENGINE='InnoDB';
--source t/index_intersect.test
SET SESSION STORAGE_ENGINE=DEFAULT;

View File

@ -18,6 +18,11 @@ let $engine_type= InnoDB;
# InnoDB does not support Merge tables (affects include/index_merge1.inc)
let $merge_table_support= 0;
set @optimizer_switch_save= @@optimizer_switch;
set optimizer_switch='index_merge_sort_intersection=off';
# The first two tests are disabled because of non deterministic explain output.
# If include/index_merge1.inc can be enabled for InnoDB and all other
# storage engines, please remove the subtest for Bug#21277 from
@ -82,3 +87,5 @@ SELECT COUNT(*) FROM
WHERE a BETWEEN 2 AND 7 OR pk=1000000) AS t;
DROP TABLE t1;
set optimizer_switch= @optimizer_switch_save;

View File

@ -14,6 +14,10 @@ let $engine_type= MyISAM;
# MyISAM supports Merge tables
let $merge_table_support= 1;
set @optimizer_switch_save= @@optimizer_switch;
set optimizer_switch='index_merge_sort_intersection=off';
--source include/index_merge1.inc
--source include/index_merge_ror.inc
--source include/index_merge2.inc
@ -164,7 +168,7 @@ set optimizer_switch='default,index_merge=off';
explain select * from t1 where a=10 and b=10;
--echo No intersect if it is disabled:
set optimizer_switch='default,index_merge_intersection=off';
set optimizer_switch='default,index_merge_sort_intersection=off,index_merge_intersection=off';
explain select * from t1 where a=10 and b=10;
--echo Do intersect when union was disabled
@ -195,3 +199,5 @@ show variables like 'optimizer_switch';
drop table t0, t1;
set optimizer_switch= @optimizer_switch_save;

View File

@ -843,7 +843,7 @@ DROP TABLE t1;
--echo #
create table t1(a int, b tinytext);
insert into t1 values (1,2),(3,2);
set session sort_buffer_size= 30000;
set session sort_buffer_size= 1000;
set session max_sort_length= 2180;
--error 1038
select * from t1 order by b;

View File

@ -33,6 +33,8 @@ ANALYZE TABLE City;
--enable_result_log
--enable_query_log
set session optimizer_switch='index_merge_sort_intersection=off';
# The following 4 queries are added for code coverage
#the exptected # of rows differ on 32-bit and 64-bit platforms for innodb
@ -68,7 +70,7 @@ SELECT * FROM City
EXPLAIN
SELECT * FROM City
WHERE (Population > 101000 AND Population < 103000);
WHERE (Population > 101000 AND Population < 102000);
EXPLAIN
SELECT * FROM City
@ -88,7 +90,7 @@ SELECT * FROM City
EXPLAIN
SELECT * FROM City
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F'))
AND (Population > 101000 AND Population < 103000);
AND (Population > 101000 AND Population < 102000);
# The following 4 queries check that the plans
# for the previous 2 plans are valid
@ -103,11 +105,11 @@ SELECT * FROM City
SELECT * FROM City USE INDEX ()
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F'))
AND (Population > 101000 AND Population < 103000);
AND (Population > 101000 AND Population < 102000);
SELECT * FROM City
WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F'))
AND (Population > 101000 AND Population < 103000);
AND (Population > 101000 AND Population < 102000);
# The output of the next 7 commands tells us about selectivities
# of the conditions utilized in 4 queries following after them
@ -197,7 +199,7 @@ SELECT * FROM City
# of the conditions utilized in 3 queries following after them
EXPLAIN
SELECT * FROM City WHERE (ID < 50) OR (ID BETWEEN 100 AND 110);
SELECT * FROM City WHERE (ID < 30) OR (ID BETWEEN 100 AND 150);
EXPLAIN
SELECT * FROM City WHERE (ID < 200) OR (ID BETWEEN 300 AND 600);
EXPLAIN
@ -219,7 +221,7 @@ SELECT * FROM City WHERE Name LIKE 'Ha%' OR Name LIKE 'Pa%' ;
EXPLAIN
SELECT * FROM City
WHERE ((ID < 50) AND (Name LIKE 'H%' OR (Country > 'A' AND Country < 'ARG')))
WHERE ((ID < 30) AND (Name LIKE 'H%' OR (Country > 'A' AND Country < 'ARG')))
OR ((ID BETWEEN 100 AND 110) AND
(Name LIKE 'P%' OR (Population > 103000 AND Population < 104000)));
@ -240,12 +242,12 @@ SELECT * FROM City
# for the previous 3 plans are valid
SELECT * FROM City USE INDEX ()
WHERE ((ID < 50) AND (Name LIKE 'H%' OR (Country > 'A' AND Country < 'ARG')))
WHERE ((ID < 30) AND (Name LIKE 'H%' OR (Country > 'A' AND Country < 'ARG')))
OR ((ID BETWEEN 100 AND 110) AND
(Name LIKE 'P%' OR (Population > 103000 AND Population < 104000)));
SELECT * FROM City
WHERE ((ID < 50) AND (Name LIKE 'H%' OR (Country > 'A' AND Country < 'ARG')))
WHERE ((ID < 30) AND (Name LIKE 'H%' OR (Country > 'A' AND Country < 'ARG')))
OR ((ID BETWEEN 100 AND 110) AND
(Name LIKE 'P%' OR (Population > 103000 AND Population < 104000)));
@ -361,7 +363,7 @@ SELECT * FROM City WHERE Name LIKE 'Pas%';
EXPLAIN
SELECT * FROM City WHERE Name LIKE 'P%';
EXPLAIN
SELECT * FROM City WHERE (Population > 101000 AND Population < 103000);
SELECT * FROM City WHERE (Population > 101000 AND Population < 102000);
EXPLAIN
SELECT * FROM City WHERE Country='USA';
@ -374,32 +376,32 @@ SELECT * FROM City WHERE Country='USA';
EXPLAIN
SELECT * FROM City
WHERE ((Population > 101000 AND Population < 103000) OR Name LIKE 'Pas%')
WHERE ((Population > 101000 AND Population < 102000) OR Name LIKE 'Pas%')
AND Country='USA';
EXPLAIN
SELECT * FROM City
WHERE ((Population > 101000 AND Population < 103000) OR Name LIKE 'P%')
AND Country='USA';
WHERE ((Population > 101000 AND Population < 1000000) OR Name LIKE 'P%' )
AND Country='USA' AND Name LIKE '%port';
# The following 4 queries check that the plans
# for the previous 2 plans are valid
SELECT * FROM City
WHERE ((Population > 101000 AND Population < 103000) OR Name LIKE 'Pas%')
WHERE ((Population > 101000 AND Population < 102000) OR Name LIKE 'Pas%')
AND Country='USA';
SELECT * FROM City USE INDEX ()
WHERE ((Population > 101000 AND Population < 103000) OR Name LIKE 'Pas%')
WHERE ((Population > 101000 AND Population < 102000) OR Name LIKE 'Pas%')
AND Country='USA';
SELECT * FROM City
WHERE ((Population > 101000 AND Population < 103000) OR Name LIKE 'P%')
AND Country='USA';
WHERE ((Population > 101000 AND Population < 1000000) OR Name LIKE 'P%')
AND Country='USA' AND Name LIKE '%port';
SELECT * FROM City USE INDEX ()
WHERE ((Population > 101000 AND Population < 103000) OR Name LIKE 'P%')
AND Country='USA';
WHERE ((Population > 101000 AND Population < 1000000) OR Name LIKE 'P%')
AND Country='USA' AND Name LIKE '%port';
CREATE INDEX CountryName ON City(Country,Name);
@ -463,9 +465,10 @@ SELECT * FROM City
EXPLAIN
SELECT * FROM City
WHERE ((Population > 101000 AND Population < 110000) OR
ID BETWEEN 3500 AND 3800) AND Country='USA'
AND (Name BETWEEN 'P' AND 'T' OR ID BETWEEN 4000 AND 4300);
WHERE ((Population > 101000 AND Population < 1000000) OR
ID BETWEEN 3000 AND 3800) AND Country='USA'
AND (Name BETWEEN 'P' AND 'Z' OR ID BETWEEN 3500 AND 4300)
AND Name LIKE '%port';
# The following 6 queries check that the plans
# for the previous 3 plans are valid
@ -491,14 +494,16 @@ SELECT * FROM City
AND (Name LIKE 'Pa%' OR ID BETWEEN 4028 AND 4032);
SELECT * FROM City USE INDEX ()
WHERE ((Population > 101000 AND Population < 102000) OR
ID BETWEEN 3790 AND 3800) AND Country='USA'
AND (Name LIKE 'Pa%' OR ID BETWEEN 4025 AND 4035);
WHERE ((Population > 101000 AND Population < 1000000) OR
ID BETWEEN 3000 AND 3800) AND Country='USA'
AND (Name BETWEEN 'P' AND 'Z' OR ID BETWEEN 3500 AND 4300)
AND Name LIKE '%port';
SELECT * FROM City
WHERE ((Population > 101000 AND Population < 102000) OR
ID BETWEEN 3790 AND 3800) AND Country='USA'
AND (Name LIKE 'Pa%' OR ID BETWEEN 4025 AND 4035);
WHERE ((Population > 101000 AND Population < 1000000) OR
ID BETWEEN 3000 AND 3800) AND Country='USA'
AND (Name BETWEEN 'P' AND 'Z' OR ID BETWEEN 3500 AND 4300)
AND Name LIKE '%port';
# The pattern of the WHERE condition used in the following query is
@ -918,3 +923,7 @@ SELECT COUNT(*) FROM t1
(pk BETWEEN 120 AND 79 + 255 OR a IN ( 4 , 179 , 1 ) ) AND a > 8 ;
DROP TABLE t1;
#the following command must be the last one in the file
set session optimizer_switch='index_merge_sort_intersection=default';

View File

@ -736,6 +736,7 @@ select * from information_schema.session_variables where variable_name like 'tmp
# Bug #19606: make ssl settings available via SHOW VARIABLES and @@variables
#
# Don't actually output, since it depends on the system
set sort_buffer_size=1024*8;
--replace_column 1 # 2 # 3 # 4 # 5 #
select @@ssl_ca, @@ssl_capath, @@ssl_cert, @@ssl_cipher, @@ssl_key;
--replace_column 2 #

View File

@ -1750,3 +1750,4 @@ void change_double_for_sort(double nr,uchar *to)
}
}
}

View File

@ -338,7 +338,7 @@ protected:
Number of comparisons of table rowids equivalent to reading one row from a
table.
*/
#define TIME_FOR_COMPARE_ROWID (TIME_FOR_COMPARE*2)
#define TIME_FOR_COMPARE_ROWID (TIME_FOR_COMPARE*100)
/*
For sequential disk seeks the cost formula is:
@ -542,12 +542,13 @@ protected:
#define OPTIMIZER_SWITCH_INDEX_MERGE_UNION 2
#define OPTIMIZER_SWITCH_INDEX_MERGE_SORT_UNION 4
#define OPTIMIZER_SWITCH_INDEX_MERGE_INTERSECT 8
#define OPTIMIZER_SWITCH_INDEX_MERGE_SORT_INTERSECT 16
#ifdef DBUG_OFF
# define OPTIMIZER_SWITCH_LAST 16
#else
# define OPTIMIZER_SWITCH_TABLE_ELIMINATION 16
# define OPTIMIZER_SWITCH_LAST 32
#else
# define OPTIMIZER_SWITCH_TABLE_ELIMINATION 32
# define OPTIMIZER_SWITCH_LAST 64
#endif
#ifdef DBUG_OFF
@ -555,12 +556,14 @@ protected:
# define OPTIMIZER_SWITCH_DEFAULT (OPTIMIZER_SWITCH_INDEX_MERGE | \
OPTIMIZER_SWITCH_INDEX_MERGE_UNION | \
OPTIMIZER_SWITCH_INDEX_MERGE_SORT_UNION | \
OPTIMIZER_SWITCH_INDEX_MERGE_INTERSECT)
OPTIMIZER_SWITCH_INDEX_MERGE_INTERSECT | \
OPTIMIZER_SWITCH_INDEX_MERGE_SORT_INTERSECT)
#else
# define OPTIMIZER_SWITCH_DEFAULT (OPTIMIZER_SWITCH_INDEX_MERGE | \
OPTIMIZER_SWITCH_INDEX_MERGE_UNION | \
OPTIMIZER_SWITCH_INDEX_MERGE_SORT_UNION | \
OPTIMIZER_SWITCH_INDEX_MERGE_INTERSECT | \
OPTIMIZER_SWITCH_INDEX_MERGE_SORT_INTERSECT | \
OPTIMIZER_SWITCH_TABLE_ELIMINATION)
#endif
@ -2232,6 +2235,8 @@ ha_rows filesort(THD *thd, TABLE *form,struct st_sort_field *sortorder,
ha_rows max_rows, bool sort_positions,
ha_rows *examined_rows);
void filesort_free_buffers(TABLE *table, bool full);
double get_merge_many_buffs_cost(uint *buffer, uint last_n_elems,
int elem_size);
void change_double_for_sort(double nr,uchar *to);
double my_double_round(double value, longlong dec, bool dec_unsigned,
bool truncate);

View File

@ -335,7 +335,7 @@ TYPELIB sql_mode_typelib= { array_elements(sql_mode_names)-1,"",
static const char *optimizer_switch_names[]=
{
"index_merge","index_merge_union","index_merge_sort_union",
"index_merge_intersection",
"index_merge_intersection","index_merge_sort_intersection",
#ifndef DBUG_OFF
"table_elimination",
#endif
@ -349,6 +349,7 @@ static const unsigned int optimizer_switch_names_len[]=
sizeof("index_merge_union") - 1,
sizeof("index_merge_sort_union") - 1,
sizeof("index_merge_intersection") - 1,
sizeof("index_merge_sort_intersection") - 1,
#ifndef DBUG_OFF
sizeof("table_elimination") - 1,
#endif
@ -428,7 +429,8 @@ static const char *sql_mode_str= "OFF";
/* Text representation for OPTIMIZER_SWITCH_DEFAULT */
static const char *optimizer_switch_str="index_merge=on,index_merge_union=on,"
"index_merge_sort_union=on,"
"index_merge_intersection=on"
"index_merge_intersection=on,"
"index_merge_sort_intersection=on"
#ifndef DBUG_OFF
",table_elimination=on";
#else
@ -7290,7 +7292,8 @@ thread is in the relay logs.",
0, GET_ULONG, OPT_ARG, MAX_TABLES+1, 0, MAX_TABLES+2, 0, 1, 0},
{"optimizer_switch", OPT_OPTIMIZER_SWITCH,
"optimizer_switch=option=val[,option=val...], where option={index_merge, "
"index_merge_union, index_merge_sort_union, index_merge_intersection"
"index_merge_union, index_merge_sort_union, index_merge_intersection, "
"index_merge_sort_intersection"
#ifndef DBUG_OFF
", table_elimination"
#endif

File diff suppressed because it is too large Load Diff

View File

@ -306,6 +306,10 @@ public:
Save ROWID of last retrieved row in file->ref. This used in ROR-merging.
*/
virtual void save_last_pos(){};
void add_key_and_length(String *key_names,
String *used_lengths,
bool *first);
/*
Append comma-separated list of keys this quick select uses to key_names;
@ -315,13 +319,15 @@ public:
virtual void add_keys_and_lengths(String *key_names,
String *used_lengths)=0;
void add_key_name(String *str, bool *first);
/*
Append text representation of quick select structure (what and how is
merged) to str. The result is added to "Extra" field in EXPLAIN output.
This function is implemented only by quick selects that merge other quick
selects output and/or can produce output suitable for merging.
*/
virtual void add_info_string(String *str) {};
virtual void add_info_string(String *str) {}
/*
Return 1 if any index used by this quick select
uses field which is marked in passed bitmap.

View File

@ -2966,6 +2966,7 @@ class Unique :public Sql_alloc
IO_CACHE file;
TREE tree;
uchar *record_pointers;
ulong filtered_out_elems;
bool flush();
uint size;
uint full_size;
@ -2991,8 +2992,15 @@ public:
void close_for_expansion() { tree.flag= TREE_ONLY_DUPS; }
bool get(TABLE *table);
inline static double get_search_cost(uint tree_elems, uint compare_factor)
{
return log((double) tree_elems) / (compare_factor * M_LN2);
}
static double get_use_cost(uint *buffer, uint nkeys, uint key_size,
ulonglong max_in_memory_size);
ulonglong max_in_memory_size, uint compare_factor,
bool intersect_fl, bool *in_memory);
inline static int get_cost_calc_buff_size(ulong nkeys, uint key_size,
ulonglong max_in_memory_size)
{

View File

@ -2684,6 +2684,7 @@ make_join_statistics(JOIN *join, TABLE_LIST *tables_arg, COND *conds,
goto error;
}
table->quick_keys.clear_all();
table->intersect_keys.clear_all();
table->reginfo.join_tab=s;
table->reginfo.not_exists_optimize=0;
bzero((char*) table->const_key_parts, sizeof(key_part_map)*table->s->keys);
@ -6369,8 +6370,10 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond)
used_tables|=current_map;
if (tab->type == JT_REF && tab->quick &&
(uint) tab->ref.key == tab->quick->index &&
tab->ref.key_length < tab->quick->max_used_key_length)
(((uint) tab->ref.key == tab->quick->index &&
tab->ref.key_length < tab->quick->max_used_key_length) ||
(!tab->table->intersect_keys.is_clear_all() &&
tab->table->intersect_keys.is_set(tab->ref.key))))
{
/* Range uses longer key; Use this instead of ref on key */
tab->type=JT_ALL;
@ -10173,6 +10176,7 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
table->quick_keys.init();
table->covering_keys.init();
table->merge_keys.init();
table->intersect_keys.init();
table->keys_in_use_for_query.init();
table->s= share;
@ -14223,6 +14227,7 @@ create_sort_index(THD *thd, JOIN *join, ORDER *order,
select->cleanup(); // filesort did select
tab->select= 0;
table->quick_keys.clear_all(); // as far as we cleanup select->quick
table->intersect_keys.clear_all();
table->sort.io_cache= tablesort_result_cache;
}
tab->select_cond=0;

View File

@ -682,7 +682,7 @@ struct st_table {
needed by the query without reading the row.
*/
key_map covering_keys;
key_map quick_keys, merge_keys;
key_map quick_keys, merge_keys,intersect_keys;
/*
A set of keys that can be used in the query that references this
table.

View File

@ -64,6 +64,8 @@ int unique_intersect_write_to_ptrs(uchar* key, element_count count, Unique *uniq
memcpy(unique->record_pointers, key, unique->size);
unique->record_pointers+=unique->size;
}
else
unique->filtered_out_elems++;
return 0;
}
@ -144,7 +146,8 @@ inline double log2_n_fact(double x)
*/
static double get_merge_buffers_cost(uint *buff_elems, uint elem_size,
uint *first, uint *last)
uint *first, uint *last,
uint compare_factor)
{
uint total_buf_elems= 0;
for (uint *pbuf= first; pbuf <= last; pbuf++)
@ -155,7 +158,7 @@ static double get_merge_buffers_cost(uint *buff_elems, uint elem_size,
/* Using log2(n)=log(n)/log(2) formula */
return 2*((double)total_buf_elems*elem_size) / IO_SIZE +
total_buf_elems*log((double) n_buffers) / (TIME_FOR_COMPARE_ROWID * M_LN2);
total_buf_elems*log((double) n_buffers) / (compare_factor * M_LN2);
}
@ -188,7 +191,8 @@ static double get_merge_buffers_cost(uint *buff_elems, uint elem_size,
static double get_merge_many_buffs_cost(uint *buffer,
uint maxbuffer, uint max_n_elems,
uint last_n_elems, int elem_size)
uint last_n_elems, int elem_size,
uint compare_factor)
{
register int i;
double total_cost= 0.0;
@ -215,19 +219,22 @@ static double get_merge_many_buffs_cost(uint *buffer,
{
total_cost+=get_merge_buffers_cost(buff_elems, elem_size,
buff_elems + i,
buff_elems + i + MERGEBUFF-1);
buff_elems + i + MERGEBUFF-1,
compare_factor);
lastbuff++;
}
total_cost+=get_merge_buffers_cost(buff_elems, elem_size,
buff_elems + i,
buff_elems + maxbuffer);
buff_elems + maxbuffer,
compare_factor);
maxbuffer= lastbuff;
}
}
/* Simulate final merge_buff call. */
total_cost += get_merge_buffers_cost(buff_elems, elem_size,
buff_elems, buff_elems + maxbuffer);
buff_elems, buff_elems + maxbuffer,
compare_factor);
return total_cost;
}
@ -242,7 +249,11 @@ static double get_merge_many_buffs_cost(uint *buffer,
to get # bytes needed.
nkeys #of elements in Unique
key_size size of each elements in bytes
max_in_memory_size amount of memory Unique will be allowed to use
max_in_memory_size amount of memory Unique will be allowed to use
compare_factor used to calculate cost of one comparison
write_fl if the result must be saved written to disk
in_memory_elems OUT estimate of the number of elements in memory
if disk is not used
RETURN
Cost in disk seeks.
@ -280,7 +291,9 @@ static double get_merge_many_buffs_cost(uint *buffer,
*/
double Unique::get_use_cost(uint *buffer, uint nkeys, uint key_size,
ulonglong max_in_memory_size)
ulonglong max_in_memory_size,
uint compare_factor,
bool intersect_fl, bool *in_memory)
{
ulong max_elements_in_tree;
ulong last_tree_elems;
@ -297,16 +310,15 @@ double Unique::get_use_cost(uint *buffer, uint nkeys, uint key_size,
result= 2*log2_n_fact(last_tree_elems + 1.0);
if (n_full_trees)
result+= n_full_trees * log2_n_fact(max_elements_in_tree + 1.0);
#if 1
result /= TIME_FOR_COMPARE_ROWID;
#else
result /= TIME_FOR_COMPARE_ROWID * 10;
#endif
result /= compare_factor;
DBUG_PRINT("info",("unique trees sizes: %u=%u*%lu + %lu", nkeys,
n_full_trees, n_full_trees?max_elements_in_tree:0,
last_tree_elems));
if (in_memory)
*in_memory= !n_full_trees;
if (!n_full_trees)
return result;
@ -320,12 +332,12 @@ double Unique::get_use_cost(uint *buffer, uint nkeys, uint key_size,
result += DISK_SEEK_BASE_COST * ceil(((double) key_size)*last_tree_elems / IO_SIZE);
/* Cost of merge */
if (intersect_fl)
key_size+= sizeof(element_count);
double merge_cost= get_merge_many_buffs_cost(buffer, n_full_trees,
max_elements_in_tree,
last_tree_elems, key_size);
if (merge_cost < 0.0)
return merge_cost;
last_tree_elems, key_size,
compare_factor);
result += merge_cost;
/*
Add cost of reading the resulting sequence, assuming there were no
@ -614,8 +626,10 @@ bool Unique::get(TABLE *table)
tree_walk_action action= min_dupl_count ?
(tree_walk_action) unique_intersect_write_to_ptrs :
(tree_walk_action) unique_write_to_ptrs;
filtered_out_elems= 0;
(void) tree_walk(&tree, action,
this, left_root_right);
table->sort.found_records-= filtered_out_elems;
return 0;
}
}
@ -686,3 +700,5 @@ err:
outfile->end_of_file=save_pos;
return error;
}

View File

@ -89,7 +89,7 @@
#define MAX_SELECT_NESTING (sizeof(nesting_map)*8-1)
#define MAX_SORT_MEMORY (2048*1024-MALLOC_OVERHEAD)
#define MIN_SORT_MEMORY (32*1024-MALLOC_OVERHEAD)
#define MIN_SORT_MEMORY (1024-MALLOC_OVERHEAD)
/* Memory allocated when parsing a statement / saving a statement */
#define MEM_ROOT_BLOCK_SIZE 8192