[Maria-developers] bzr commit into MariaDB 5.1, with Maria 1.5:maria branch (igor:2744) WL#24
#At lp:maria based on revid:knielsen@knielsen-hq.org-20091006183755-y08lid6fg8mnr8sk 2744 Igor Babaev 2009-10-11 The main patch for WL#24: "index_merge: fair choice between index_merge union and range access" added: mysql-test/include/world.inc mysql-test/include/world_schema.inc mysql-test/r/range_vs_index_merge.result mysql-test/r/range_vs_index_merge_innodb.result mysql-test/t/range_vs_index_merge.test mysql-test/t/range_vs_index_merge_innodb.test modified: mysql-test/r/index_merge_myisam.result sql/opt_range.cc sql/sql_list.h per-file messages: mysql-test/include/world.inc A new include file to upload the world database. mysql-test/include/world_schema.inc A new include file to create tables of the world database. mysql-test/r/index_merge_myisam.result The results for test cases testing the optimizations added in WL#24 for MyISAM. mysql-test/r/range_vs_index_merge.result The results for test cases testing the optimizations added in WL#24 for InnoDB. mysql-test/t/range_vs_index_merge.test Test cases to test the optimizations added in WL#24 for MyISAM. mysql-test/t/range_vs_index_merge_innodb.test Test cases to test the optimizations added in WL#24 for InnoDB. sql/sql_list.h Fixed a bug that did not allow adding a non-empty list to an empty list. === added file 'mysql-test/include/world.inc' --- a/mysql-test/include/world.inc 1970-01-01 00:00:00 +0000 +++ b/mysql-test/include/world.inc 2009-10-12 04:59:34 +0000 @@ -0,0 +1,5343 @@ +# +# Populate the world database +# + +# Table Country + +INSERT INTO Country VALUES +('AFG','Afghanistan',652090.00,22720000,1), +('NLD','Netherlands',41526.00,15864000,5), +('ANT','Netherlands Antilles',800.00,217000,33), +('ALB','Albania',28748.00,3401200,34), +('DZA','Algeria',2381741.00,31471000,35), +('ASM','American Samoa',199.00,68000,54), +('AND','Andorra',468.00,78000,55), +('AGO','Angola',1246700.00,12878000,56), +('AIA','Anguilla',96.00,8000,62), +('ATG','Antigua and Barbuda',442.00,68000,63), +('ARE','United Arab Emirates',83600.00,2441000,65), +('ARG','Argentina',2780400.00,37032000,69), +('ARM','Armenia',29800.00,3520000,126), +('ABW','Aruba',193.00,103000,129), +('AUS','Australia',7741220.00,18886000,135), +('AZE','Azerbaijan',86600.00,7734000,144), +('BHS','Bahamas',13878.00,307000,148), +('BHR','Bahrain',694.00,617000,149), +('BGD','Bangladesh',143998.00,129155000,150), +('BRB','Barbados',430.00,270000,174), +('BEL','Belgium',30518.00,10239000,179), +('BLZ','Belize',22696.00,241000,185), +('BEN','Benin',112622.00,6097000,187), +('BMU','Bermuda',53.00,65000,191), +('BTN','Bhutan',47000.00,2124000,192), +('BOL','Bolivia',1098581.00,8329000,194), +('BIH','Bosnia and Herzegovina',51197.00,3972000,201), +('BWA','Botswana',581730.00,1622000,204), +('BRA','Brazil',8547403.00,170115000,211), +('GBR','United Kingdom',242900.00,59623400,456), +('VGB','Virgin Islands, British',151.00,21000,537), +('BRN','Brunei',5765.00,328000,538), +('BGR','Bulgaria',110994.00,8190900,539), +('BFA','Burkina Faso',274000.00,11937000,549), +('BDI','Burundi',27834.00,6695000,552), +('CYM','Cayman Islands',264.00,38000,553), +('CHL','Chile',756626.00,15211000,554), +('COK','Cook Islands',236.00,20000,583), +('CRI','Costa Rica',51100.00,4023000,584), +('DJI','Djibouti',23200.00,638000,585), +('DMA','Dominica',751.00,71000,586), +('DOM','Dominican Republic',48511.00,8495000,587), +('ECU','Ecuador',283561.00,12646000,594), +('EGY','Egypt',1001449.00,68470000,608), +('SLV','El Salvador',21041.00,6276000,645), +('ERI','Eritrea',117600.00,3850000,652), +('ESP','Spain',505992.00,39441700,653), +('ZAF','South Africa',1221037.00,40377000,716), +('ETH','Ethiopia',1104300.00,62565000,756), +('FLK','Falkland Islands',12173.00,2000,763), +('FJI','Fiji Islands',18274.00,817000,764), +('PHL','Philippines',300000.00,75967000,766), +('FRO','Faroe Islands',1399.00,43000,901), +('GAB','Gabon',267668.00,1226000,902), +('GMB','Gambia',11295.00,1305000,904), +('GEO','Georgia',69700.00,4968000,905), +('GHA','Ghana',238533.00,20212000,910), +('GIB','Gibraltar',6.00,25000,915), +('GRD','Grenada',344.00,94000,916), +('GRL','Greenland',2166090.00,56000,917), +('GLP','Guadeloupe',1705.00,456000,919), +('GUM','Guam',549.00,168000,921), +('GTM','Guatemala',108889.00,11385000,922), +('GIN','Guinea',245857.00,7430000,926), +('GNB','Guinea-Bissau',36125.00,1213000,927), +('GUY','Guyana',214969.00,861000,928), +('HTI','Haiti',27750.00,8222000,929), +('HND','Honduras',112088.00,6485000,933), +('HKG','Hong Kong',1075.00,6782000,937), +('SJM','Svalbard and Jan Mayen',62422.00,3200,938), +('IDN','Indonesia',1904569.00,212107000,939), +('IND','India',3287263.00,1013662000,1109), +('IRQ','Iraq',438317.00,23115000,1365), +('IRN','Iran',1648195.00,67702000,1380), +('IRL','Ireland',70273.00,3775100,1447), +('ISL','Iceland',103000.00,279000,1449), +('ISR','Israel',21056.00,6217000,1450), +('ITA','Italy',301316.00,57680000,1464), +('TMP','East Timor',14874.00,885000,1522), +('AUT','Austria',83859.00,8091800,1523), +('JAM','Jamaica',10990.00,2583000,1530), +('JPN','Japan',377829.00,126714000,1532), +('YEM','Yemen',527968.00,18112000,1780), +('JOR','Jordan',88946.00,5083000,1786), +('CXR','Christmas Island',135.00,2500,1791), +('YUG','Yugoslavia',102173.00,10640000,1792), +('KHM','Cambodia',181035.00,11168000,1800), +('CMR','Cameroon',475442.00,15085000,1804), +('CAN','Canada',9970610.00,31147000,1822), +('CPV','Cape Verde',4033.00,428000,1859), +('KAZ','Kazakstan',2724900.00,16223000,1864), +('KEN','Kenya',580367.00,30080000,1881), +('CAF','Central African Republic',622984.00,3615000,1889), +('CHN','China',9572900.00,1277558000,1891), +('KGZ','Kyrgyzstan',199900.00,4699000,2253), +('KIR','Kiribati',726.00,83000,2256), +('COL','Colombia',1138914.00,42321000,2257), +('COM','Comoros',1862.00,578000,2295), +('COG','Congo',342000.00,2943000,2296), +('COD','Congo, The Democratic Republic of the',2344858.00,51654000,2298), +('CCK','Cocos (Keeling) Islands',14.00,600,2317), +('PRK','North Korea',120538.00,24039000,2318), +('KOR','South Korea',99434.00,46844000,2331), +('GRC','Greece',131626.00,10545700,2401), +('HRV','Croatia',56538.00,4473000,2409), +('CUB','Cuba',110861.00,11201000,2413), +('KWT','Kuwait',17818.00,1972000,2429), +('CYP','Cyprus',9251.00,754700,2430), +('LAO','Laos',236800.00,5433000,2432), +('LVA','Latvia',64589.00,2424200,2434), +('LSO','Lesotho',30355.00,2153000,2437), +('LBN','Lebanon',10400.00,3282000,2438), +('LBR','Liberia',111369.00,3154000,2440), +('LBY','Libyan Arab Jamahiriya',1759540.00,5605000,2441), +('LIE','Liechtenstein',160.00,32300,2446), +('LTU','Lithuania',65301.00,3698500,2447), +('LUX','Luxembourg',2586.00,435700,2452), +('ESH','Western Sahara',266000.00,293000,2453), +('MAC','Macao',18.00,473000,2454), +('MDG','Madagascar',587041.00,15942000,2455), +('MKD','Macedonia',25713.00,2024000,2460), +('MWI','Malawi',118484.00,10925000,2462), +('MDV','Maldives',298.00,286000,2463), +('MYS','Malaysia',329758.00,22244000,2464), +('MLI','Mali',1240192.00,11234000,2482), +('MLT','Malta',316.00,380200,2484), +('MAR','Morocco',446550.00,28351000,2486), +('MHL','Marshall Islands',181.00,64000,2507), +('MTQ','Martinique',1102.00,395000,2508), +('MRT','Mauritania',1025520.00,2670000,2509), +('MUS','Mauritius',2040.00,1158000,2511), +('MYT','Mayotte',373.00,149000,2514), +('MEX','Mexico',1958201.00,98881000,2515), +('FSM','Micronesia, Federated States of',702.00,119000,2689), +('MDA','Moldova',33851.00,4380000,2690), +('MCO','Monaco',1.50,34000,2695), +('MNG','Mongolia',1566500.00,2662000,2696), +('MSR','Montserrat',102.00,11000,2697), +('MOZ','Mozambique',801590.00,19680000,2698), +('MMR','Myanmar',676578.00,45611000,2710), +('NAM','Namibia',824292.00,1726000,2726), +('NRU','Nauru',21.00,12000,2728), +('NPL','Nepal',147181.00,23930000,2729), +('NIC','Nicaragua',130000.00,5074000,2734), +('NER','Niger',1267000.00,10730000,2738), +('NGA','Nigeria',923768.00,111506000,2754), +('NIU','Niue',260.00,2000,2805), +('NFK','Norfolk Island',36.00,2000,2806), +('NOR','Norway',323877.00,4478500,2807), +('CIV','Côte dIvoire',322463.00,14786000,2814), +('OMN','Oman',309500.00,2542000,2821), +('PAK','Pakistan',796095.00,156483000,2831), +('PLW','Palau',459.00,19000,2881), +('PAN','Panama',75517.00,2856000,2882), +('PNG','Papua New Guinea',462840.00,4807000,2884), +('PRY','Paraguay',406752.00,5496000,2885), +('PER','Peru',1285216.00,25662000,2890), +('PCN','Pitcairn',49.00,50,2912), +('MNP','Northern Mariana Islands',464.00,78000,2913), +('PRT','Portugal',91982.00,9997600,2914), +('PRI','Puerto Rico',8875.00,3869000,2919), +('POL','Poland',323250.00,38653600,2928), +('GNQ','Equatorial Guinea',28051.00,453000,2972), +('QAT','Qatar',11000.00,599000,2973), +('FRA','France',551500.00,59225700,2974), +('GUF','French Guiana',90000.00,181000,3014), +('PYF','French Polynesia',4000.00,235000,3016), +('REU','Réunion',2510.00,699000,3017), +('ROM','Romania',238391.00,22455500,3018), +('RWA','Rwanda',26338.00,7733000,3047), +('SWE','Sweden',449964.00,8861400,3048), +('SHN','Saint Helena',314.00,6000,3063), +('KNA','Saint Kitts and Nevis',261.00,38000,3064), +('LCA','Saint Lucia',622.00,154000,3065), +('VCT','Saint Vincent and the Grenadines',388.00,114000,3066), +('SPM','Saint Pierre and Miquelon',242.00,7000,3067), +('DEU','Germany',357022.00,82164700,3068), +('SLB','Solomon Islands',28896.00,444000,3161), +('ZMB','Zambia',752618.00,9169000,3162), +('WSM','Samoa',2831.00,180000,3169), +('SMR','San Marino',61.00,27000,3171), +('STP','Sao Tome and Principe',964.00,147000,3172), +('SAU','Saudi Arabia',2149690.00,21607000,3173), +('SEN','Senegal',196722.00,9481000,3198), +('SYC','Seychelles',455.00,77000,3206), +('SLE','Sierra Leone',71740.00,4854000,3207), +('SGP','Singapore',618.00,3567000,3208), +('SVK','Slovakia',49012.00,5398700,3209), +('SVN','Slovenia',20256.00,1987800,3212), +('SOM','Somalia',637657.00,10097000,3214), +('LKA','Sri Lanka',65610.00,18827000,3217), +('SDN','Sudan',2505813.00,29490000,3225), +('FIN','Finland',338145.00,5171300,3236), +('SUR','Suriname',163265.00,417000,3243), +('SWZ','Swaziland',17364.00,1008000,3244), +('CHE','Switzerland',41284.00,7160400,3248), +('SYR','Syria',185180.00,16125000,3250), +('TJK','Tajikistan',143100.00,6188000,3261), +('TWN','Taiwan',36188.00,22256000,3263), +('TZA','Tanzania',883749.00,33517000,3306), +('DNK','Denmark',43094.00,5330000,3315), +('THA','Thailand',513115.00,61399000,3320), +('TGO','Togo',56785.00,4629000,3332), +('TKL','Tokelau',12.00,2000,3333), +('TON','Tonga',650.00,99000,3334), +('TTO','Trinidad and Tobago',5130.00,1295000,3336), +('TCD','Chad',1284000.00,7651000,3337), +('CZE','Czech Republic',78866.00,10278100,3339), +('TUN','Tunisia',163610.00,9586000,3349), +('TUR','Turkey',774815.00,66591000,3358), +('TKM','Turkmenistan',488100.00,4459000,3419), +('TCA','Turks and Caicos Islands',430.00,17000,3423), +('TUV','Tuvalu',26.00,12000,3424), +('UGA','Uganda',241038.00,21778000,3425), +('UKR','Ukraine',603700.00,50456000,3426), +('HUN','Hungary',93030.00,10043200,3483), +('URY','Uruguay',175016.00,3337000,3492), +('NCL','New Caledonia',18575.00,214000,3493), +('NZL','New Zealand',270534.00,3862000,3499), +('UZB','Uzbekistan',447400.00,24318000,3503), +('BLR','Belarus',207600.00,10236000,3520), +('WLF','Wallis and Futuna',200.00,15000,3536), +('VUT','Vanuatu',12189.00,190000,3537), +('VAT','Holy See (Vatican City State)',0.40,1000,3538), +('VEN','Venezuela',912050.00,24170000,3539), +('RUS','Russian Federation',17075400.00,146934000,3580), +('VNM','Vietnam',331689.00,79832000,3770), +('EST','Estonia',45227.00,1439200,3791), +('USA','United States',9363520.00,278357000,3813), +('VIR','Virgin Islands, U.S.',347.00,93000,4067), +('ZWE','Zimbabwe',390757.00,11669000,4068), +('PSE','Palestine',6257.00,3101000,4074), +('ATA','Antarctica',13120000.00,0,NULL), +('BVT','Bouvet Island',59.00,0,NULL), +('IOT','British Indian Ocean Territory',78.00,0,NULL), +('SGS','South Georgia and the South Sandwich Islands',3903.00,0,NULL), +('HMD','Heard Island and McDonald Islands',359.00,0,NULL), +('ATF','French Southern territories',7780.00,0,NULL), +('UMI','United States Minor Outlying Islands',16.00,0,NULL); + +# Table City + +INSERT INTO City VALUES +(1,'Kabul','AFG',1780000), +(2,'Qandahar','AFG',237500), +(3,'Herat','AFG',186800), +(4,'Mazar-e-Sharif','AFG',127800), +(5,'Amsterdam','NLD',731200), +(6,'Rotterdam','NLD',593321), +(7,'Haag','NLD',440900), +(8,'Utrecht','NLD',234323), +(9,'Eindhoven','NLD',201843), +(10,'Tilburg','NLD',193238), +(11,'Groningen','NLD',172701), +(12,'Breda','NLD',160398), +(13,'Apeldoorn','NLD',153491), +(14,'Nijmegen','NLD',152463), +(15,'Enschede','NLD',149544), +(16,'Haarlem','NLD',148772), +(17,'Almere','NLD',142465), +(18,'Arnhem','NLD',138020), +(19,'Zaanstad','NLD',135621), +(20,'´s-Hertogenbosch','NLD',129170), +(21,'Amersfoort','NLD',126270), +(22,'Maastricht','NLD',122087), +(23,'Dordrecht','NLD',119811), +(24,'Leiden','NLD',117196), +(25,'Haarlemmermeer','NLD',110722), +(26,'Zoetermeer','NLD',110214), +(27,'Emmen','NLD',105853), +(28,'Zwolle','NLD',105819), +(29,'Ede','NLD',101574), +(30,'Delft','NLD',95268), +(31,'Heerlen','NLD',95052), +(32,'Alkmaar','NLD',92713), +(33,'Willemstad','ANT',2345), +(34,'Tirana','ALB',270000), +(35,'Alger','DZA',2168000), +(36,'Oran','DZA',609823), +(37,'Constantine','DZA',443727), +(38,'Annaba','DZA',222518), +(39,'Batna','DZA',183377), +(40,'Sétif','DZA',179055), +(41,'Sidi Bel Abbès','DZA',153106), +(42,'Skikda','DZA',128747), +(43,'Biskra','DZA',128281), +(44,'Blida (el-Boulaida)','DZA',127284), +(45,'Béjaïa','DZA',117162), +(46,'Mostaganem','DZA',115212), +(47,'Tébessa','DZA',112007), +(48,'Tlemcen (Tilimsen)','DZA',110242), +(49,'Béchar','DZA',107311), +(50,'Tiaret','DZA',100118), +(51,'Ech-Chleff (el-Asnam)','DZA',96794), +(52,'Ghardaïa','DZA',89415), +(53,'Tafuna','ASM',5200), +(54,'Fagatogo','ASM',2323), +(55,'Andorra la Vella','AND',21189), +(56,'Luanda','AGO',2022000), +(57,'Huambo','AGO',163100), +(58,'Lobito','AGO',130000), +(59,'Benguela','AGO',128300), +(60,'Namibe','AGO',118200), +(61,'South Hill','AIA',961), +(62,'The Valley','AIA',595), +(63,'Saint John´s','ATG',24000), +(64,'Dubai','ARE',669181), +(65,'Abu Dhabi','ARE',398695), +(66,'Sharja','ARE',320095), +(67,'al-Ayn','ARE',225970), +(68,'Ajman','ARE',114395), +(69,'Buenos Aires','ARG',2982146), +(70,'La Matanza','ARG',1266461), +(71,'Córdoba','ARG',1157507), +(72,'Rosario','ARG',907718), +(73,'Lomas de Zamora','ARG',622013), +(74,'Quilmes','ARG',559249), +(75,'Almirante Brown','ARG',538918), +(76,'La Plata','ARG',521936), +(77,'Mar del Plata','ARG',512880), +(78,'San Miguel de Tucumán','ARG',470809), +(79,'Lanús','ARG',469735), +(80,'Merlo','ARG',463846), +(81,'General San Martín','ARG',422542), +(82,'Salta','ARG',367550), +(83,'Moreno','ARG',356993), +(84,'Santa Fé','ARG',353063), +(85,'Avellaneda','ARG',353046), +(86,'Tres de Febrero','ARG',352311), +(87,'Morón','ARG',349246), +(88,'Florencio Varela','ARG',315432), +(89,'San Isidro','ARG',306341), +(90,'Tigre','ARG',296226), +(91,'Malvinas Argentinas','ARG',290335), +(92,'Vicente López','ARG',288341), +(93,'Berazategui','ARG',276916), +(94,'Corrientes','ARG',258103), +(95,'San Miguel','ARG',248700), +(96,'Bahía Blanca','ARG',239810), +(97,'Esteban Echeverría','ARG',235760), +(98,'Resistencia','ARG',229212), +(99,'José C. Paz','ARG',221754), +(100,'Paraná','ARG',207041), +(101,'Godoy Cruz','ARG',206998), +(102,'Posadas','ARG',201273), +(103,'Guaymallén','ARG',200595), +(104,'Santiago del Estero','ARG',189947), +(105,'San Salvador de Jujuy','ARG',178748), +(106,'Hurlingham','ARG',170028), +(107,'Neuquén','ARG',167296), +(108,'Ituzaingó','ARG',158197), +(109,'San Fernando','ARG',153036), +(110,'Formosa','ARG',147636), +(111,'Las Heras','ARG',145823), +(112,'La Rioja','ARG',138117), +(113,'San Fernando del Valle de Cata','ARG',134935), +(114,'Río Cuarto','ARG',134355), +(115,'Comodoro Rivadavia','ARG',124104), +(116,'Mendoza','ARG',123027), +(117,'San Nicolás de los Arroyos','ARG',119302), +(118,'San Juan','ARG',119152), +(119,'Escobar','ARG',116675), +(120,'Concordia','ARG',116485), +(121,'Pilar','ARG',113428), +(122,'San Luis','ARG',110136), +(123,'Ezeiza','ARG',99578), +(124,'San Rafael','ARG',94651), +(125,'Tandil','ARG',91101), +(126,'Yerevan','ARM',1248700), +(127,'Gjumri','ARM',211700), +(128,'Vanadzor','ARM',172700), +(129,'Oranjestad','ABW',29034), +(130,'Sydney','AUS',3276207), +(131,'Melbourne','AUS',2865329), +(132,'Brisbane','AUS',1291117), +(133,'Perth','AUS',1096829), +(134,'Adelaide','AUS',978100), +(135,'Canberra','AUS',322723), +(136,'Gold Coast','AUS',311932), +(137,'Newcastle','AUS',270324), +(138,'Central Coast','AUS',227657), +(139,'Wollongong','AUS',219761), +(140,'Hobart','AUS',126118), +(141,'Geelong','AUS',125382), +(142,'Townsville','AUS',109914), +(143,'Cairns','AUS',92273), +(144,'Baku','AZE',1787800), +(145,'Gäncä','AZE',299300), +(146,'Sumqayit','AZE',283000), +(147,'Mingäçevir','AZE',93900), +(148,'Nassau','BHS',172000), +(149,'al-Manama','BHR',148000), +(150,'Dhaka','BGD',3612850), +(151,'Chittagong','BGD',1392860), +(152,'Khulna','BGD',663340), +(153,'Rajshahi','BGD',294056), +(154,'Narayanganj','BGD',202134), +(155,'Rangpur','BGD',191398), +(156,'Mymensingh','BGD',188713), +(157,'Barisal','BGD',170232), +(158,'Tungi','BGD',168702), +(159,'Jessore','BGD',139710), +(160,'Comilla','BGD',135313), +(161,'Nawabganj','BGD',130577), +(162,'Dinajpur','BGD',127815), +(163,'Bogra','BGD',120170), +(164,'Sylhet','BGD',117396), +(165,'Brahmanbaria','BGD',109032), +(166,'Tangail','BGD',106004), +(167,'Jamalpur','BGD',103556), +(168,'Pabna','BGD',103277), +(169,'Naogaon','BGD',101266), +(170,'Sirajganj','BGD',99669), +(171,'Narsinghdi','BGD',98342), +(172,'Saidpur','BGD',96777), +(173,'Gazipur','BGD',96717), +(174,'Bridgetown','BRB',6070), +(175,'Antwerpen','BEL',446525), +(176,'Gent','BEL',224180), +(177,'Charleroi','BEL',200827), +(178,'Liège','BEL',185639), +(179,'Bruxelles [Brussel]','BEL',133859), +(180,'Brugge','BEL',116246), +(181,'Schaerbeek','BEL',105692), +(182,'Namur','BEL',105419), +(183,'Mons','BEL',90935), +(184,'Belize City','BLZ',55810), +(185,'Belmopan','BLZ',7105), +(186,'Cotonou','BEN',536827), +(187,'Porto-Novo','BEN',194000), +(188,'Djougou','BEN',134099), +(189,'Parakou','BEN',103577), +(190,'Saint George','BMU',1800), +(191,'Hamilton','BMU',1200), +(192,'Thimphu','BTN',22000), +(193,'Santa Cruz de la Sierra','BOL',935361), +(194,'La Paz','BOL',758141), +(195,'El Alto','BOL',534466), +(196,'Cochabamba','BOL',482800), +(197,'Oruro','BOL',223553), +(198,'Sucre','BOL',178426), +(199,'Potosí','BOL',140642), +(200,'Tarija','BOL',125255); +INSERT INTO City VALUES +(201,'Sarajevo','BIH',360000), +(202,'Banja Luka','BIH',143079), +(203,'Zenica','BIH',96027), +(204,'Gaborone','BWA',213017), +(205,'Francistown','BWA',101805), +(206,'São Paulo','BRA',9968485), +(207,'Rio de Janeiro','BRA',5598953), +(208,'Salvador','BRA',2302832), +(209,'Belo Horizonte','BRA',2139125), +(210,'Fortaleza','BRA',2097757), +(211,'Brasília','BRA',1969868), +(212,'Curitiba','BRA',1584232), +(213,'Recife','BRA',1378087), +(214,'Porto Alegre','BRA',1314032), +(215,'Manaus','BRA',1255049), +(216,'Belém','BRA',1186926), +(217,'Guarulhos','BRA',1095874), +(218,'Goiânia','BRA',1056330), +(219,'Campinas','BRA',950043), +(220,'São Gonçalo','BRA',869254), +(221,'Nova Iguaçu','BRA',862225), +(222,'São Luís','BRA',837588), +(223,'Maceió','BRA',786288), +(224,'Duque de Caxias','BRA',746758), +(225,'São Bernardo do Campo','BRA',723132), +(226,'Teresina','BRA',691942), +(227,'Natal','BRA',688955), +(228,'Osasco','BRA',659604), +(229,'Campo Grande','BRA',649593), +(230,'Santo André','BRA',630073), +(231,'João Pessoa','BRA',584029), +(232,'Jaboatão dos Guararapes','BRA',558680), +(233,'Contagem','BRA',520801), +(234,'São José dos Campos','BRA',515553), +(235,'Uberlândia','BRA',487222), +(236,'Feira de Santana','BRA',479992), +(237,'Ribeirão Preto','BRA',473276), +(238,'Sorocaba','BRA',466823), +(239,'Niterói','BRA',459884), +(240,'Cuiabá','BRA',453813), +(241,'Juiz de Fora','BRA',450288), +(242,'Aracaju','BRA',445555), +(243,'São João de Meriti','BRA',440052), +(244,'Londrina','BRA',432257), +(245,'Joinville','BRA',428011), +(246,'Belford Roxo','BRA',425194), +(247,'Santos','BRA',408748), +(248,'Ananindeua','BRA',400940), +(249,'Campos dos Goytacazes','BRA',398418), +(250,'Mauá','BRA',375055), +(251,'Carapicuíba','BRA',357552), +(252,'Olinda','BRA',354732), +(253,'Campina Grande','BRA',352497), +(254,'São José do Rio Preto','BRA',351944), +(255,'Caxias do Sul','BRA',349581), +(256,'Moji das Cruzes','BRA',339194), +(257,'Diadema','BRA',335078), +(258,'Aparecida de Goiânia','BRA',324662), +(259,'Piracicaba','BRA',319104), +(260,'Cariacica','BRA',319033), +(261,'Vila Velha','BRA',318758), +(262,'Pelotas','BRA',315415), +(263,'Bauru','BRA',313670), +(264,'Porto Velho','BRA',309750), +(265,'Serra','BRA',302666), +(266,'Betim','BRA',302108), +(267,'Jundíaí','BRA',296127), +(268,'Canoas','BRA',294125), +(269,'Franca','BRA',290139), +(270,'São Vicente','BRA',286848), +(271,'Maringá','BRA',286461), +(272,'Montes Claros','BRA',286058), +(273,'Anápolis','BRA',282197), +(274,'Florianópolis','BRA',281928), +(275,'Petrópolis','BRA',279183), +(276,'Itaquaquecetuba','BRA',270874), +(277,'Vitória','BRA',270626), +(278,'Ponta Grossa','BRA',268013), +(279,'Rio Branco','BRA',259537), +(280,'Foz do Iguaçu','BRA',259425), +(281,'Macapá','BRA',256033), +(282,'Ilhéus','BRA',254970), +(283,'Vitória da Conquista','BRA',253587), +(284,'Uberaba','BRA',249225), +(285,'Paulista','BRA',248473), +(286,'Limeira','BRA',245497), +(287,'Blumenau','BRA',244379), +(288,'Caruaru','BRA',244247), +(289,'Santarém','BRA',241771), +(290,'Volta Redonda','BRA',240315), +(291,'Novo Hamburgo','BRA',239940), +(292,'Caucaia','BRA',238738), +(293,'Santa Maria','BRA',238473), +(294,'Cascavel','BRA',237510), +(295,'Guarujá','BRA',237206), +(296,'Ribeirão das Neves','BRA',232685), +(297,'Governador Valadares','BRA',231724), +(298,'Taubaté','BRA',229130), +(299,'Imperatriz','BRA',224564), +(300,'Gravataí','BRA',223011), +(301,'Embu','BRA',222223), +(302,'Mossoró','BRA',214901), +(303,'Várzea Grande','BRA',214435), +(304,'Petrolina','BRA',210540), +(305,'Barueri','BRA',208426), +(306,'Viamão','BRA',207557), +(307,'Ipatinga','BRA',206338), +(308,'Juazeiro','BRA',201073), +(309,'Juazeiro do Norte','BRA',199636), +(310,'Taboão da Serra','BRA',197550), +(311,'São José dos Pinhais','BRA',196884), +(312,'Magé','BRA',196147), +(313,'Suzano','BRA',195434), +(314,'São Leopoldo','BRA',189258), +(315,'Marília','BRA',188691), +(316,'São Carlos','BRA',187122), +(317,'Sumaré','BRA',186205), +(318,'Presidente Prudente','BRA',185340), +(319,'Divinópolis','BRA',185047), +(320,'Sete Lagoas','BRA',182984), +(321,'Rio Grande','BRA',182222), +(322,'Itabuna','BRA',182148), +(323,'Jequié','BRA',179128), +(324,'Arapiraca','BRA',178988), +(325,'Colombo','BRA',177764), +(326,'Americana','BRA',177409), +(327,'Alvorada','BRA',175574), +(328,'Araraquara','BRA',174381), +(329,'Itaboraí','BRA',173977), +(330,'Santa Bárbara d´Oeste','BRA',171657), +(331,'Nova Friburgo','BRA',170697), +(332,'Jacareí','BRA',170356), +(333,'Araçatuba','BRA',169303), +(334,'Barra Mansa','BRA',168953), +(335,'Praia Grande','BRA',168434), +(336,'Marabá','BRA',167795), +(337,'Criciúma','BRA',167661), +(338,'Boa Vista','BRA',167185), +(339,'Passo Fundo','BRA',166343), +(340,'Dourados','BRA',164716), +(341,'Santa Luzia','BRA',164704), +(342,'Rio Claro','BRA',163551), +(343,'Maracanaú','BRA',162022), +(344,'Guarapuava','BRA',160510), +(345,'Rondonópolis','BRA',155115), +(346,'São José','BRA',155105), +(347,'Cachoeiro de Itapemirim','BRA',155024), +(348,'Nilópolis','BRA',153383), +(349,'Itapevi','BRA',150664), +(350,'Cabo de Santo Agostinho','BRA',149964), +(351,'Camaçari','BRA',149146), +(352,'Sobral','BRA',146005), +(353,'Itajaí','BRA',145197), +(354,'Chapecó','BRA',144158), +(355,'Cotia','BRA',140042), +(356,'Lages','BRA',139570), +(357,'Ferraz de Vasconcelos','BRA',139283), +(358,'Indaiatuba','BRA',135968), +(359,'Hortolândia','BRA',135755), +(360,'Caxias','BRA',133980), +(361,'São Caetano do Sul','BRA',133321), +(362,'Itu','BRA',132736), +(363,'Nossa Senhora do Socorro','BRA',131351), +(364,'Parnaíba','BRA',129756), +(365,'Poços de Caldas','BRA',129683), +(366,'Teresópolis','BRA',128079), +(367,'Barreiras','BRA',127801), +(368,'Castanhal','BRA',127634), +(369,'Alagoinhas','BRA',126820), +(370,'Itapecerica da Serra','BRA',126672), +(371,'Uruguaiana','BRA',126305), +(372,'Paranaguá','BRA',126076), +(373,'Ibirité','BRA',125982), +(374,'Timon','BRA',125812), +(375,'Luziânia','BRA',125597), +(376,'Macaé','BRA',125597), +(377,'Teófilo Otoni','BRA',124489), +(378,'Moji-Guaçu','BRA',123782), +(379,'Palmas','BRA',121919), +(380,'Pindamonhangaba','BRA',121904), +(381,'Francisco Morato','BRA',121197), +(382,'Bagé','BRA',120793), +(383,'Sapucaia do Sul','BRA',120217), +(384,'Cabo Frio','BRA',119503), +(385,'Itapetininga','BRA',119391), +(386,'Patos de Minas','BRA',119262), +(387,'Camaragibe','BRA',118968), +(388,'Bragança Paulista','BRA',116929), +(389,'Queimados','BRA',115020), +(390,'Araguaína','BRA',114948), +(391,'Garanhuns','BRA',114603), +(392,'Vitória de Santo Antão','BRA',113595), +(393,'Santa Rita','BRA',113135), +(394,'Barbacena','BRA',113079), +(395,'Abaetetuba','BRA',111258), +(396,'Jaú','BRA',109965), +(397,'Lauro de Freitas','BRA',109236), +(398,'Franco da Rocha','BRA',108964), +(399,'Teixeira de Freitas','BRA',108441), +(400,'Varginha','BRA',108314); +INSERT INTO City VALUES +(401,'Ribeirão Pires','BRA',108121), +(402,'Sabará','BRA',107781), +(403,'Catanduva','BRA',107761), +(404,'Rio Verde','BRA',107755), +(405,'Botucatu','BRA',107663), +(406,'Colatina','BRA',107354), +(407,'Santa Cruz do Sul','BRA',106734), +(408,'Linhares','BRA',106278), +(409,'Apucarana','BRA',105114), +(410,'Barretos','BRA',104156), +(411,'Guaratinguetá','BRA',103433), +(412,'Cachoeirinha','BRA',103240), +(413,'Codó','BRA',103153), +(414,'Jaraguá do Sul','BRA',102580), +(415,'Cubatão','BRA',102372), +(416,'Itabira','BRA',102217), +(417,'Itaituba','BRA',101320), +(418,'Araras','BRA',101046), +(419,'Resende','BRA',100627), +(420,'Atibaia','BRA',100356), +(421,'Pouso Alegre','BRA',100028), +(422,'Toledo','BRA',99387), +(423,'Crato','BRA',98965), +(424,'Passos','BRA',98570), +(425,'Araguari','BRA',98399), +(426,'São José de Ribamar','BRA',98318), +(427,'Pinhais','BRA',98198), +(428,'Sertãozinho','BRA',98140), +(429,'Conselheiro Lafaiete','BRA',97507), +(430,'Paulo Afonso','BRA',97291), +(431,'Angra dos Reis','BRA',96864), +(432,'Eunápolis','BRA',96610), +(433,'Salto','BRA',96348), +(434,'Ourinhos','BRA',96291), +(435,'Parnamirim','BRA',96210), +(436,'Jacobina','BRA',96131), +(437,'Coronel Fabriciano','BRA',95933), +(438,'Birigui','BRA',94685), +(439,'Tatuí','BRA',93897), +(440,'Ji-Paraná','BRA',93346), +(441,'Bacabal','BRA',93121), +(442,'Cametá','BRA',92779), +(443,'Guaíba','BRA',92224), +(444,'São Lourenço da Mata','BRA',91999), +(445,'Santana do Livramento','BRA',91779), +(446,'Votorantim','BRA',91777), +(447,'Campo Largo','BRA',91203), +(448,'Patos','BRA',90519), +(449,'Ituiutaba','BRA',90507), +(450,'Corumbá','BRA',90111), +(451,'Palhoça','BRA',89465), +(452,'Barra do Piraí','BRA',89388), +(453,'Bento Gonçalves','BRA',89254), +(454,'Poá','BRA',89236), +(455,'Águas Lindas de Goiás','BRA',89200), +(456,'London','GBR',7285000), +(457,'Birmingham','GBR',1013000), +(458,'Glasgow','GBR',619680), +(459,'Liverpool','GBR',461000), +(460,'Edinburgh','GBR',450180), +(461,'Sheffield','GBR',431607), +(462,'Manchester','GBR',430000), +(463,'Leeds','GBR',424194), +(464,'Bristol','GBR',402000), +(465,'Cardiff','GBR',321000), +(466,'Coventry','GBR',304000), +(467,'Leicester','GBR',294000), +(468,'Bradford','GBR',289376), +(469,'Belfast','GBR',287500), +(470,'Nottingham','GBR',287000), +(471,'Kingston upon Hull','GBR',262000), +(472,'Plymouth','GBR',253000), +(473,'Stoke-on-Trent','GBR',252000), +(474,'Wolverhampton','GBR',242000), +(475,'Derby','GBR',236000), +(476,'Swansea','GBR',230000), +(477,'Southampton','GBR',216000), +(478,'Aberdeen','GBR',213070), +(479,'Northampton','GBR',196000), +(480,'Dudley','GBR',192171), +(481,'Portsmouth','GBR',190000), +(482,'Newcastle upon Tyne','GBR',189150), +(483,'Sunderland','GBR',183310), +(484,'Luton','GBR',183000), +(485,'Swindon','GBR',180000), +(486,'Southend-on-Sea','GBR',176000), +(487,'Walsall','GBR',174739), +(488,'Bournemouth','GBR',162000), +(489,'Peterborough','GBR',156000), +(490,'Brighton','GBR',156124), +(491,'Blackpool','GBR',151000), +(492,'Dundee','GBR',146690), +(493,'West Bromwich','GBR',146386), +(494,'Reading','GBR',148000), +(495,'Oldbury/Smethwick (Warley)','GBR',145542), +(496,'Middlesbrough','GBR',145000), +(497,'Huddersfield','GBR',143726), +(498,'Oxford','GBR',144000), +(499,'Poole','GBR',141000), +(500,'Bolton','GBR',139020), +(501,'Blackburn','GBR',140000), +(502,'Newport','GBR',139000), +(503,'Preston','GBR',135000), +(504,'Stockport','GBR',132813), +(505,'Norwich','GBR',124000), +(506,'Rotherham','GBR',121380), +(507,'Cambridge','GBR',121000), +(508,'Watford','GBR',113080), +(509,'Ipswich','GBR',114000), +(510,'Slough','GBR',112000), +(511,'Exeter','GBR',111000), +(512,'Cheltenham','GBR',106000), +(513,'Gloucester','GBR',107000), +(514,'Saint Helens','GBR',106293), +(515,'Sutton Coldfield','GBR',106001), +(516,'York','GBR',104425), +(517,'Oldham','GBR',103931), +(518,'Basildon','GBR',100924), +(519,'Worthing','GBR',100000), +(520,'Chelmsford','GBR',97451), +(521,'Colchester','GBR',96063), +(522,'Crawley','GBR',97000), +(523,'Gillingham','GBR',92000), +(524,'Solihull','GBR',94531), +(525,'Rochdale','GBR',94313), +(526,'Birkenhead','GBR',93087), +(527,'Worcester','GBR',95000), +(528,'Hartlepool','GBR',92000), +(529,'Halifax','GBR',91069), +(530,'Woking/Byfleet','GBR',92000), +(531,'Southport','GBR',90959), +(532,'Maidstone','GBR',90878), +(533,'Eastbourne','GBR',90000), +(534,'Grimsby','GBR',89000), +(535,'Saint Helier','GBR',27523), +(536,'Douglas','GBR',23487), +(537,'Road Town','VGB',8000), +(538,'Bandar Seri Begawan','BRN',21484), +(539,'Sofija','BGR',1122302), +(540,'Plovdiv','BGR',342584), +(541,'Varna','BGR',299801), +(542,'Burgas','BGR',195255), +(543,'Ruse','BGR',166467), +(544,'Stara Zagora','BGR',147939), +(545,'Pleven','BGR',121952), +(546,'Sliven','BGR',105530), +(547,'Dobric','BGR',100399), +(548,'umen','BGR',94686), +(549,'Ouagadougou','BFA',824000), +(550,'Bobo-Dioulasso','BFA',300000), +(551,'Koudougou','BFA',105000), +(552,'Bujumbura','BDI',300000), +(553,'George Town','CYM',19600), +(554,'Santiago de Chile','CHL',4703954), +(555,'Puente Alto','CHL',386236), +(556,'Viña del Mar','CHL',312493), +(557,'Valparaíso','CHL',293800), +(558,'Talcahuano','CHL',277752), +(559,'Antofagasta','CHL',251429), +(560,'San Bernardo','CHL',241910), +(561,'Temuco','CHL',233041), +(562,'Concepción','CHL',217664), +(563,'Rancagua','CHL',212977), +(564,'Arica','CHL',189036), +(565,'Talca','CHL',187557), +(566,'Chillán','CHL',178182), +(567,'Iquique','CHL',177892), +(568,'Los Angeles','CHL',158215), +(569,'Puerto Montt','CHL',152194), +(570,'Coquimbo','CHL',143353), +(571,'Osorno','CHL',141468), +(572,'La Serena','CHL',137409), +(573,'Calama','CHL',137265), +(574,'Valdivia','CHL',133106), +(575,'Punta Arenas','CHL',125631), +(576,'Copiapó','CHL',120128), +(577,'Quilpué','CHL',118857), +(578,'Curicó','CHL',115766), +(579,'Ovalle','CHL',94854), +(580,'Coronel','CHL',93061), +(581,'San Pedro de la Paz','CHL',91684), +(582,'Melipilla','CHL',91056), +(583,'Avarua','COK',11900), +(584,'San José','CRI',339131), +(585,'Djibouti','DJI',383000), +(586,'Roseau','DMA',16243), +(587,'Santo Domingo de Guzmán','DOM',1609966), +(588,'Santiago de los Caballeros','DOM',365463), +(589,'La Romana','DOM',140204), +(590,'San Pedro de Macorís','DOM',124735), +(591,'San Francisco de Macorís','DOM',108485), +(592,'San Felipe de Puerto Plata','DOM',89423), +(593,'Guayaquil','ECU',2070040), +(594,'Quito','ECU',1573458), +(595,'Cuenca','ECU',270353), +(596,'Machala','ECU',210368), +(597,'Santo Domingo de los Colorados','ECU',202111), +(598,'Portoviejo','ECU',176413), +(599,'Ambato','ECU',169612), +(600,'Manta','ECU',164739); +INSERT INTO City VALUES +(601,'Duran [Eloy Alfaro]','ECU',152514), +(602,'Ibarra','ECU',130643), +(603,'Quevedo','ECU',129631), +(604,'Milagro','ECU',124177), +(605,'Loja','ECU',123875), +(606,'Ríobamba','ECU',123163), +(607,'Esmeraldas','ECU',123045), +(608,'Cairo','EGY',6789479), +(609,'Alexandria','EGY',3328196), +(610,'Giza','EGY',2221868), +(611,'Shubra al-Khayma','EGY',870716), +(612,'Port Said','EGY',469533), +(613,'Suez','EGY',417610), +(614,'al-Mahallat al-Kubra','EGY',395402), +(615,'Tanta','EGY',371010), +(616,'al-Mansura','EGY',369621), +(617,'Luxor','EGY',360503), +(618,'Asyut','EGY',343498), +(619,'Bahtim','EGY',275807), +(620,'Zagazig','EGY',267351), +(621,'al-Faiyum','EGY',260964), +(622,'Ismailia','EGY',254477), +(623,'Kafr al-Dawwar','EGY',231978), +(624,'Assuan','EGY',219017), +(625,'Damanhur','EGY',212203), +(626,'al-Minya','EGY',201360), +(627,'Bani Suwayf','EGY',172032), +(628,'Qina','EGY',171275), +(629,'Sawhaj','EGY',170125), +(630,'Shibin al-Kawm','EGY',159909), +(631,'Bulaq al-Dakrur','EGY',148787), +(632,'Banha','EGY',145792), +(633,'Warraq al-Arab','EGY',127108), +(634,'Kafr al-Shaykh','EGY',124819), +(635,'Mallawi','EGY',119283), +(636,'Bilbays','EGY',113608), +(637,'Mit Ghamr','EGY',101801), +(638,'al-Arish','EGY',100447), +(639,'Talkha','EGY',97700), +(640,'Qalyub','EGY',97200), +(641,'Jirja','EGY',95400), +(642,'Idfu','EGY',94200), +(643,'al-Hawamidiya','EGY',91700), +(644,'Disuq','EGY',91300), +(645,'San Salvador','SLV',415346), +(646,'Santa Ana','SLV',139389), +(647,'Mejicanos','SLV',138800), +(648,'Soyapango','SLV',129800), +(649,'San Miguel','SLV',127696), +(650,'Nueva San Salvador','SLV',98400), +(651,'Apopa','SLV',88800), +(652,'Asmara','ERI',431000), +(653,'Madrid','ESP',2879052), +(654,'Barcelona','ESP',1503451), +(655,'Valencia','ESP',739412), +(656,'Sevilla','ESP',701927), +(657,'Zaragoza','ESP',603367), +(658,'Málaga','ESP',530553), +(659,'Bilbao','ESP',357589), +(660,'Las Palmas de Gran Canaria','ESP',354757), +(661,'Murcia','ESP',353504), +(662,'Palma de Mallorca','ESP',326993), +(663,'Valladolid','ESP',319998), +(664,'Córdoba','ESP',311708), +(665,'Vigo','ESP',283670), +(666,'Alicante [Alacant]','ESP',272432), +(667,'Gijón','ESP',267980), +(668,'L´Hospitalet de Llobregat','ESP',247986), +(669,'Granada','ESP',244767), +(670,'A Coruña (La Coruña)','ESP',243402), +(671,'Vitoria-Gasteiz','ESP',217154), +(672,'Santa Cruz de Tenerife','ESP',213050), +(673,'Badalona','ESP',209635), +(674,'Oviedo','ESP',200453), +(675,'Móstoles','ESP',195351), +(676,'Elche [Elx]','ESP',193174), +(677,'Sabadell','ESP',184859), +(678,'Santander','ESP',184165), +(679,'Jerez de la Frontera','ESP',182660), +(680,'Pamplona [Iruña]','ESP',180483), +(681,'Donostia-San Sebastián','ESP',179208), +(682,'Cartagena','ESP',177709), +(683,'Leganés','ESP',173163), +(684,'Fuenlabrada','ESP',171173), +(685,'Almería','ESP',169027), +(686,'Terrassa','ESP',168695), +(687,'Alcalá de Henares','ESP',164463), +(688,'Burgos','ESP',162802), +(689,'Salamanca','ESP',158720), +(690,'Albacete','ESP',147527), +(691,'Getafe','ESP',145371), +(692,'Cádiz','ESP',142449), +(693,'Alcorcón','ESP',142048), +(694,'Huelva','ESP',140583), +(695,'León','ESP',139809), +(696,'Castellón de la Plana [Castell','ESP',139712), +(697,'Badajoz','ESP',136613), +(698,'[San Cristóbal de] la Laguna','ESP',127945), +(699,'Logroño','ESP',127093), +(700,'Santa Coloma de Gramenet','ESP',120802), +(701,'Tarragona','ESP',113016), +(702,'Lleida (Lérida)','ESP',112207), +(703,'Jaén','ESP',109247), +(704,'Ourense (Orense)','ESP',109120), +(705,'Mataró','ESP',104095), +(706,'Algeciras','ESP',103106), +(707,'Marbella','ESP',101144), +(708,'Barakaldo','ESP',98212), +(709,'Dos Hermanas','ESP',94591), +(710,'Santiago de Compostela','ESP',93745), +(711,'Torrejón de Ardoz','ESP',92262), +(712,'Cape Town','ZAF',2352121), +(713,'Soweto','ZAF',904165), +(714,'Johannesburg','ZAF',756653), +(715,'Port Elizabeth','ZAF',752319), +(716,'Pretoria','ZAF',658630), +(717,'Inanda','ZAF',634065), +(718,'Durban','ZAF',566120), +(719,'Vanderbijlpark','ZAF',468931), +(720,'Kempton Park','ZAF',442633), +(721,'Alberton','ZAF',410102), +(722,'Pinetown','ZAF',378810), +(723,'Pietermaritzburg','ZAF',370190), +(724,'Benoni','ZAF',365467), +(725,'Randburg','ZAF',341288), +(726,'Umlazi','ZAF',339233), +(727,'Bloemfontein','ZAF',334341), +(728,'Vereeniging','ZAF',328535), +(729,'Wonderboom','ZAF',283289), +(730,'Roodepoort','ZAF',279340), +(731,'Boksburg','ZAF',262648), +(732,'Klerksdorp','ZAF',261911), +(733,'Soshanguve','ZAF',242727), +(734,'Newcastle','ZAF',222993), +(735,'East London','ZAF',221047), +(736,'Welkom','ZAF',203296), +(737,'Kimberley','ZAF',197254), +(738,'Uitenhage','ZAF',192120), +(739,'Chatsworth','ZAF',189885), +(740,'Mdantsane','ZAF',182639), +(741,'Krugersdorp','ZAF',181503), +(742,'Botshabelo','ZAF',177971), +(743,'Brakpan','ZAF',171363), +(744,'Witbank','ZAF',167183), +(745,'Oberholzer','ZAF',164367), +(746,'Germiston','ZAF',164252), +(747,'Springs','ZAF',162072), +(748,'Westonaria','ZAF',159632), +(749,'Randfontein','ZAF',120838), +(750,'Paarl','ZAF',105768), +(751,'Potchefstroom','ZAF',101817), +(752,'Rustenburg','ZAF',97008), +(753,'Nigel','ZAF',96734), +(754,'George','ZAF',93818), +(755,'Ladysmith','ZAF',89292), +(756,'Addis Abeba','ETH',2495000), +(757,'Dire Dawa','ETH',164851), +(758,'Nazret','ETH',127842), +(759,'Gonder','ETH',112249), +(760,'Dese','ETH',97314), +(761,'Mekele','ETH',96938), +(762,'Bahir Dar','ETH',96140), +(763,'Stanley','FLK',1636), +(764,'Suva','FJI',77366), +(765,'Quezon','PHL',2173831), +(766,'Manila','PHL',1581082), +(767,'Kalookan','PHL',1177604), +(768,'Davao','PHL',1147116), +(769,'Cebu','PHL',718821), +(770,'Zamboanga','PHL',601794), +(771,'Pasig','PHL',505058), +(772,'Valenzuela','PHL',485433), +(773,'Las Piñas','PHL',472780), +(774,'Antipolo','PHL',470866), +(775,'Taguig','PHL',467375), +(776,'Cagayan de Oro','PHL',461877), +(777,'Parañaque','PHL',449811), +(778,'Makati','PHL',444867), +(779,'Bacolod','PHL',429076), +(780,'General Santos','PHL',411822), +(781,'Marikina','PHL',391170), +(782,'Dasmariñas','PHL',379520), +(783,'Muntinlupa','PHL',379310), +(784,'Iloilo','PHL',365820), +(785,'Pasay','PHL',354908), +(786,'Malabon','PHL',338855), +(787,'San José del Monte','PHL',315807), +(788,'Bacoor','PHL',305699), +(789,'Iligan','PHL',285061), +(790,'Calamba','PHL',281146), +(791,'Mandaluyong','PHL',278474), +(792,'Butuan','PHL',267279), +(793,'Angeles','PHL',263971), +(794,'Tarlac','PHL',262481), +(795,'Mandaue','PHL',259728), +(796,'Baguio','PHL',252386), +(797,'Batangas','PHL',247588), +(798,'Cainta','PHL',242511), +(799,'San Pedro','PHL',231403), + (800,'Navotas','PHL',230403); +INSERT INTO City VALUES +(801,'Cabanatuan','PHL',222859), +(802,'San Fernando','PHL',221857), +(803,'Lipa','PHL',218447), +(804,'Lapu-Lapu','PHL',217019), +(805,'San Pablo','PHL',207927), +(806,'Biñan','PHL',201186), +(807,'Taytay','PHL',198183), +(808,'Lucena','PHL',196075), +(809,'Imus','PHL',195482), +(810,'Olongapo','PHL',194260), +(811,'Binangonan','PHL',187691), +(812,'Santa Rosa','PHL',185633), +(813,'Tagum','PHL',179531), +(814,'Tacloban','PHL',178639), +(815,'Malolos','PHL',175291), +(816,'Mabalacat','PHL',171045), +(817,'Cotabato','PHL',163849), +(818,'Meycauayan','PHL',163037), +(819,'Puerto Princesa','PHL',161912), +(820,'Legazpi','PHL',157010), +(821,'Silang','PHL',156137), +(822,'Ormoc','PHL',154297), +(823,'San Carlos','PHL',154264), +(824,'Kabankalan','PHL',149769), +(825,'Talisay','PHL',148110), +(826,'Valencia','PHL',147924), +(827,'Calbayog','PHL',147187), +(828,'Santa Maria','PHL',144282), +(829,'Pagadian','PHL',142515), +(830,'Cadiz','PHL',141954), +(831,'Bago','PHL',141721), +(832,'Toledo','PHL',141174), +(833,'Naga','PHL',137810), +(834,'San Mateo','PHL',135603), +(835,'Panabo','PHL',133950), +(836,'Koronadal','PHL',133786), +(837,'Marawi','PHL',131090), +(838,'Dagupan','PHL',130328), +(839,'Sagay','PHL',129765), +(840,'Roxas','PHL',126352), +(841,'Lubao','PHL',125699), +(842,'Digos','PHL',125171), +(843,'San Miguel','PHL',123824), +(844,'Malaybalay','PHL',123672), +(845,'Tuguegarao','PHL',120645), +(846,'Ilagan','PHL',119990), +(847,'Baliuag','PHL',119675), +(848,'Surigao','PHL',118534), +(849,'San Carlos','PHL',118259), +(850,'San Juan del Monte','PHL',117680), +(851,'Tanauan','PHL',117539), +(852,'Concepcion','PHL',115171), +(853,'Rodriguez (Montalban)','PHL',115167), +(854,'Sariaya','PHL',114568), +(855,'Malasiqui','PHL',113190), +(856,'General Mariano Alvarez','PHL',112446), +(857,'Urdaneta','PHL',111582), +(858,'Hagonoy','PHL',111425), +(859,'San Jose','PHL',111009), +(860,'Polomolok','PHL',110709), +(861,'Santiago','PHL',110531), +(862,'Tanza','PHL',110517), +(863,'Ozamis','PHL',110420), +(864,'Mexico','PHL',109481), +(865,'San Jose','PHL',108254), +(866,'Silay','PHL',107722), +(867,'General Trias','PHL',107691), +(868,'Tabaco','PHL',107166), +(869,'Cabuyao','PHL',106630), +(870,'Calapan','PHL',105910), +(871,'Mati','PHL',105908), +(872,'Midsayap','PHL',105760), +(873,'Cauayan','PHL',103952), +(874,'Gingoog','PHL',102379), +(875,'Dumaguete','PHL',102265), +(876,'San Fernando','PHL',102082), +(877,'Arayat','PHL',101792), +(878,'Bayawan (Tulong)','PHL',101391), +(879,'Kidapawan','PHL',101205), +(880,'Daraga (Locsin)','PHL',101031), +(881,'Marilao','PHL',101017), +(882,'Malita','PHL',100000), +(883,'Dipolog','PHL',99862), +(884,'Cavite','PHL',99367), +(885,'Danao','PHL',98781), +(886,'Bislig','PHL',97860), +(887,'Talavera','PHL',97329), +(888,'Guagua','PHL',96858), +(889,'Bayambang','PHL',96609), +(890,'Nasugbu','PHL',96113), +(891,'Baybay','PHL',95630), +(892,'Capas','PHL',95219), +(893,'Sultan Kudarat','PHL',94861), +(894,'Laoag','PHL',94466), +(895,'Bayugan','PHL',93623), +(896,'Malungon','PHL',93232), +(897,'Santa Cruz','PHL',92694), +(898,'Sorsogon','PHL',92512), +(899,'Candelaria','PHL',92429), +(900,'Ligao','PHL',90603), +(901,'Tórshavn','FRO',14542), +(902,'Libreville','GAB',419000), +(903,'Serekunda','GMB',102600), +(904,'Banjul','GMB',42326), +(905,'Tbilisi','GEO',1235200), +(906,'Kutaisi','GEO',240900), +(907,'Rustavi','GEO',155400), +(908,'Batumi','GEO',137700), +(909,'Sohumi','GEO',111700), +(910,'Accra','GHA',1070000), +(911,'Kumasi','GHA',385192), +(912,'Tamale','GHA',151069), +(913,'Tema','GHA',109975), +(914,'Sekondi-Takoradi','GHA',103653), +(915,'Gibraltar','GIB',27025), +(916,'Saint George´s','GRD',4621), +(917,'Nuuk','GRL',13445), +(918,'Les Abymes','GLP',62947), +(919,'Basse-Terre','GLP',12433), +(920,'Tamuning','GUM',9500), +(921,'Agaña','GUM',1139), +(922,'Ciudad de Guatemala','GTM',823301), +(923,'Mixco','GTM',209791), +(924,'Villa Nueva','GTM',101295), +(925,'Quetzaltenango','GTM',90801), +(926,'Conakry','GIN',1090610), +(927,'Bissau','GNB',241000), +(928,'Georgetown','GUY',254000), +(929,'Port-au-Prince','HTI',884472), +(930,'Carrefour','HTI',290204), +(931,'Delmas','HTI',240429), +(932,'Le-Cap-Haïtien','HTI',102233), +(933,'Tegucigalpa','HND',813900), +(934,'San Pedro Sula','HND',383900), +(935,'La Ceiba','HND',89200), +(936,'Kowloon and New Kowloon','HKG',1987996), +(937,'Victoria','HKG',1312637), +(938,'Longyearbyen','SJM',1438), +(939,'Jakarta','IDN',9604900), +(940,'Surabaya','IDN',2663820), +(941,'Bandung','IDN',2429000), +(942,'Medan','IDN',1843919), +(943,'Palembang','IDN',1222764), +(944,'Tangerang','IDN',1198300), +(945,'Semarang','IDN',1104405), +(946,'Ujung Pandang','IDN',1060257), +(947,'Malang','IDN',716862), +(948,'Bandar Lampung','IDN',680332), +(949,'Bekasi','IDN',644300), +(950,'Padang','IDN',534474), +(951,'Surakarta','IDN',518600), +(952,'Banjarmasin','IDN',482931), +(953,'Pekan Baru','IDN',438638), +(954,'Denpasar','IDN',435000), +(955,'Yogyakarta','IDN',418944), +(956,'Pontianak','IDN',409632), +(957,'Samarinda','IDN',399175), +(958,'Jambi','IDN',385201), +(959,'Depok','IDN',365200), +(960,'Cimahi','IDN',344600), +(961,'Balikpapan','IDN',338752), +(962,'Manado','IDN',332288), +(963,'Mataram','IDN',306600), +(964,'Pekalongan','IDN',301504), +(965,'Tegal','IDN',289744), +(966,'Bogor','IDN',285114), +(967,'Ciputat','IDN',270800), +(968,'Pondokgede','IDN',263200), +(969,'Cirebon','IDN',254406), +(970,'Kediri','IDN',253760), +(971,'Ambon','IDN',249312), +(972,'Jember','IDN',218500), +(973,'Cilacap','IDN',206900), +(974,'Cimanggis','IDN',205100), +(975,'Pematang Siantar','IDN',203056), +(976,'Purwokerto','IDN',202500), +(977,'Ciomas','IDN',187400), +(978,'Tasikmalaya','IDN',179800), +(979,'Madiun','IDN',171532), +(980,'Bengkulu','IDN',146439), +(981,'Karawang','IDN',145000), +(982,'Banda Aceh','IDN',143409), +(983,'Palu','IDN',142800), +(984,'Pasuruan','IDN',134019), +(985,'Kupang','IDN',129300), +(986,'Tebing Tinggi','IDN',129300), +(987,'Percut Sei Tuan','IDN',129000), +(988,'Binjai','IDN',127222), +(989,'Sukabumi','IDN',125766), +(990,'Waru','IDN',124300), +(991,'Pangkal Pinang','IDN',124000), +(992,'Magelang','IDN',123800), +(993,'Blitar','IDN',122600), +(994,'Serang','IDN',122400), +(995,'Probolinggo','IDN',120770), +(996,'Cilegon','IDN',117000), +(997,'Cianjur','IDN',114300), +(998,'Ciparay','IDN',111500), +(999,'Lhokseumawe','IDN',109600), +(1000,'Taman','IDN',107000); +INSERT INTO City VALUES +(1001,'Depok','IDN',106800), +(1002,'Citeureup','IDN',105100), +(1003,'Pemalang','IDN',103500), +(1004,'Klaten','IDN',103300), +(1005,'Salatiga','IDN',103000), +(1006,'Cibinong','IDN',101300), +(1007,'Palangka Raya','IDN',99693), +(1008,'Mojokerto','IDN',96626), +(1009,'Purwakarta','IDN',95900), +(1010,'Garut','IDN',95800), +(1011,'Kudus','IDN',95300), +(1012,'Kendari','IDN',94800), +(1013,'Jaya Pura','IDN',94700), +(1014,'Gorontalo','IDN',94058), +(1015,'Majalaya','IDN',93200), +(1016,'Pondok Aren','IDN',92700), +(1017,'Jombang','IDN',92600), +(1018,'Sunggal','IDN',92300), +(1019,'Batam','IDN',91871), +(1020,'Padang Sidempuan','IDN',91200), +(1021,'Sawangan','IDN',91100), +(1022,'Banyuwangi','IDN',89900), +(1023,'Tanjung Pinang','IDN',89900), +(1024,'Mumbai (Bombay)','IND',10500000), +(1025,'Delhi','IND',7206704), +(1026,'Calcutta [Kolkata]','IND',4399819), +(1027,'Chennai (Madras)','IND',3841396), +(1028,'Hyderabad','IND',2964638), +(1029,'Ahmedabad','IND',2876710), +(1030,'Bangalore','IND',2660088), +(1031,'Kanpur','IND',1874409), +(1032,'Nagpur','IND',1624752), +(1033,'Lucknow','IND',1619115), +(1034,'Pune','IND',1566651), +(1035,'Surat','IND',1498817), +(1036,'Jaipur','IND',1458483), +(1037,'Indore','IND',1091674), +(1038,'Bhopal','IND',1062771), +(1039,'Ludhiana','IND',1042740), +(1040,'Vadodara (Baroda)','IND',1031346), +(1041,'Kalyan','IND',1014557), +(1042,'Madurai','IND',977856), +(1043,'Haora (Howrah)','IND',950435), +(1044,'Varanasi (Benares)','IND',929270), +(1045,'Patna','IND',917243), +(1046,'Srinagar','IND',892506), +(1047,'Agra','IND',891790), +(1048,'Coimbatore','IND',816321), +(1049,'Thane (Thana)','IND',803389), +(1050,'Allahabad','IND',792858), +(1051,'Meerut','IND',753778), +(1052,'Vishakhapatnam','IND',752037), +(1053,'Jabalpur','IND',741927), +(1054,'Amritsar','IND',708835), +(1055,'Faridabad','IND',703592), +(1056,'Vijayawada','IND',701827), +(1057,'Gwalior','IND',690765), +(1058,'Jodhpur','IND',666279), +(1059,'Nashik (Nasik)','IND',656925), +(1060,'Hubli-Dharwad','IND',648298), +(1061,'Solapur (Sholapur)','IND',604215), +(1062,'Ranchi','IND',599306), +(1063,'Bareilly','IND',587211), +(1064,'Guwahati (Gauhati)','IND',584342), +(1065,'Shambajinagar (Aurangabad)','IND',573272), +(1066,'Cochin (Kochi)','IND',564589), +(1067,'Rajkot','IND',559407), +(1068,'Kota','IND',537371), +(1069,'Thiruvananthapuram (Trivandrum','IND',524006), +(1070,'Pimpri-Chinchwad','IND',517083), +(1071,'Jalandhar (Jullundur)','IND',509510), +(1072,'Gorakhpur','IND',505566), +(1073,'Chandigarh','IND',504094), +(1074,'Mysore','IND',480692), +(1075,'Aligarh','IND',480520), +(1076,'Guntur','IND',471051), +(1077,'Jamshedpur','IND',460577), +(1078,'Ghaziabad','IND',454156), +(1079,'Warangal','IND',447657), +(1080,'Raipur','IND',438639), +(1081,'Moradabad','IND',429214), +(1082,'Durgapur','IND',425836), +(1083,'Amravati','IND',421576), +(1084,'Calicut (Kozhikode)','IND',419831), +(1085,'Bikaner','IND',416289), +(1086,'Bhubaneswar','IND',411542), +(1087,'Kolhapur','IND',406370), +(1088,'Kataka (Cuttack)','IND',403418), +(1089,'Ajmer','IND',402700), +(1090,'Bhavnagar','IND',402338), +(1091,'Tiruchirapalli','IND',387223), +(1092,'Bhilai','IND',386159), +(1093,'Bhiwandi','IND',379070), +(1094,'Saharanpur','IND',374945), +(1095,'Ulhasnagar','IND',369077), +(1096,'Salem','IND',366712), +(1097,'Ujjain','IND',362266), +(1098,'Malegaon','IND',342595), +(1099,'Jamnagar','IND',341637), +(1100,'Bokaro Steel City','IND',333683), +(1101,'Akola','IND',328034), +(1102,'Belgaum','IND',326399), +(1103,'Rajahmundry','IND',324851), +(1104,'Nellore','IND',316606), +(1105,'Udaipur','IND',308571), +(1106,'New Bombay','IND',307297), +(1107,'Bhatpara','IND',304952), +(1108,'Gulbarga','IND',304099), +(1109,'New Delhi','IND',301297), +(1110,'Jhansi','IND',300850), +(1111,'Gaya','IND',291675), +(1112,'Kakinada','IND',279980), +(1113,'Dhule (Dhulia)','IND',278317), +(1114,'Panihati','IND',275990), +(1115,'Nanded (Nander)','IND',275083), +(1116,'Mangalore','IND',273304), +(1117,'Dehra Dun','IND',270159), +(1118,'Kamarhati','IND',266889), +(1119,'Davangere','IND',266082), +(1120,'Asansol','IND',262188), +(1121,'Bhagalpur','IND',253225), +(1122,'Bellary','IND',245391), +(1123,'Barddhaman (Burdwan)','IND',245079), +(1124,'Rampur','IND',243742), +(1125,'Jalgaon','IND',242193), +(1126,'Muzaffarpur','IND',241107), +(1127,'Nizamabad','IND',241034), +(1128,'Muzaffarnagar','IND',240609), +(1129,'Patiala','IND',238368), +(1130,'Shahjahanpur','IND',237713), +(1131,'Kurnool','IND',236800), +(1132,'Tiruppur (Tirupper)','IND',235661), +(1133,'Rohtak','IND',233400), +(1134,'South Dum Dum','IND',232811), +(1135,'Mathura','IND',226691), +(1136,'Chandrapur','IND',226105), +(1137,'Barahanagar (Baranagar)','IND',224821), +(1138,'Darbhanga','IND',218391), +(1139,'Siliguri (Shiliguri)','IND',216950), +(1140,'Raurkela','IND',215489), +(1141,'Ambattur','IND',215424), +(1142,'Panipat','IND',215218), +(1143,'Firozabad','IND',215128), +(1144,'Ichalkaranji','IND',214950), +(1145,'Jammu','IND',214737), +(1146,'Ramagundam','IND',214384), +(1147,'Eluru','IND',212866), +(1148,'Brahmapur','IND',210418), +(1149,'Alwar','IND',205086), +(1150,'Pondicherry','IND',203065), +(1151,'Thanjavur','IND',202013), +(1152,'Bihar Sharif','IND',201323), +(1153,'Tuticorin','IND',199854), +(1154,'Imphal','IND',198535), +(1155,'Latur','IND',197408), +(1156,'Sagar','IND',195346), +(1157,'Farrukhabad-cum-Fatehgarh','IND',194567), +(1158,'Sangli','IND',193197), +(1159,'Parbhani','IND',190255), +(1160,'Nagar Coil','IND',190084), +(1161,'Bijapur','IND',186939), +(1162,'Kukatpalle','IND',185378), +(1163,'Bally','IND',184474), +(1164,'Bhilwara','IND',183965), +(1165,'Ratlam','IND',183375), +(1166,'Avadi','IND',183215), +(1167,'Dindigul','IND',182477), +(1168,'Ahmadnagar','IND',181339), +(1169,'Bilaspur','IND',179833), +(1170,'Shimoga','IND',179258), +(1171,'Kharagpur','IND',177989), +(1172,'Mira Bhayandar','IND',175372), +(1173,'Vellore','IND',175061), +(1174,'Jalna','IND',174985), +(1175,'Burnpur','IND',174933), +(1176,'Anantapur','IND',174924), +(1177,'Allappuzha (Alleppey)','IND',174666), +(1178,'Tirupati','IND',174369), +(1179,'Karnal','IND',173751), +(1180,'Burhanpur','IND',172710), +(1181,'Hisar (Hissar)','IND',172677), +(1182,'Tiruvottiyur','IND',172562), +(1183,'Mirzapur-cum-Vindhyachal','IND',169336), +(1184,'Secunderabad','IND',167461), +(1185,'Nadiad','IND',167051), +(1186,'Dewas','IND',164364), +(1187,'Murwara (Katni)','IND',163431), +(1188,'Ganganagar','IND',161482), +(1189,'Vizianagaram','IND',160359), +(1190,'Erode','IND',159232), +(1191,'Machilipatnam (Masulipatam)','IND',159110), +(1192,'Bhatinda (Bathinda)','IND',159042), +(1193,'Raichur','IND',157551), +(1194,'Agartala','IND',157358), +(1195,'Arrah (Ara)','IND',157082), +(1196,'Satna','IND',156630), +(1197,'Lalbahadur Nagar','IND',155500), +(1198,'Aizawl','IND',155240), +(1199,'Uluberia','IND',155172), +(1200,'Katihar','IND',154367); +INSERT INTO City VALUES +(1201,'Cuddalore','IND',153086), +(1202,'Hugli-Chinsurah','IND',151806), +(1203,'Dhanbad','IND',151789), +(1204,'Raiganj','IND',151045), +(1205,'Sambhal','IND',150869), +(1206,'Durg','IND',150645), +(1207,'Munger (Monghyr)','IND',150112), +(1208,'Kanchipuram','IND',150100), +(1209,'North Dum Dum','IND',149965), +(1210,'Karimnagar','IND',148583), +(1211,'Bharatpur','IND',148519), +(1212,'Sikar','IND',148272), +(1213,'Hardwar (Haridwar)','IND',147305), +(1214,'Dabgram','IND',147217), +(1215,'Morena','IND',147124), +(1216,'Noida','IND',146514), +(1217,'Hapur','IND',146262), +(1218,'Bhusawal','IND',145143), +(1219,'Khandwa','IND',145133), +(1220,'Yamuna Nagar','IND',144346), +(1221,'Sonipat (Sonepat)','IND',143922), +(1222,'Tenali','IND',143726), +(1223,'Raurkela Civil Township','IND',140408), +(1224,'Kollam (Quilon)','IND',139852), +(1225,'Kumbakonam','IND',139483), +(1226,'Ingraj Bazar (English Bazar)','IND',139204), +(1227,'Timkur','IND',138903), +(1228,'Amroha','IND',137061), +(1229,'Serampore','IND',137028), +(1230,'Chapra','IND',136877), +(1231,'Pali','IND',136842), +(1232,'Maunath Bhanjan','IND',136697), +(1233,'Adoni','IND',136182), +(1234,'Jaunpur','IND',136062), +(1235,'Tirunelveli','IND',135825), +(1236,'Bahraich','IND',135400), +(1237,'Gadag Betigeri','IND',134051), +(1238,'Proddatur','IND',133914), +(1239,'Chittoor','IND',133462), +(1240,'Barrackpur','IND',133265), +(1241,'Bharuch (Broach)','IND',133102), +(1242,'Naihati','IND',132701), +(1243,'Shillong','IND',131719), +(1244,'Sambalpur','IND',131138), +(1245,'Junagadh','IND',130484), +(1246,'Rae Bareli','IND',129904), +(1247,'Rewa','IND',128981), +(1248,'Gurgaon','IND',128608), +(1249,'Khammam','IND',127992), +(1250,'Bulandshahr','IND',127201), +(1251,'Navsari','IND',126089), +(1252,'Malkajgiri','IND',126066), +(1253,'Midnapore (Medinipur)','IND',125498), +(1254,'Miraj','IND',125407), +(1255,'Raj Nandgaon','IND',125371), +(1256,'Alandur','IND',125244), +(1257,'Puri','IND',125199), +(1258,'Navadwip','IND',125037), +(1259,'Sirsa','IND',125000), +(1260,'Korba','IND',124501), +(1261,'Faizabad','IND',124437), +(1262,'Etawah','IND',124072), +(1263,'Pathankot','IND',123930), +(1264,'Gandhinagar','IND',123359), +(1265,'Palghat (Palakkad)','IND',123289), +(1266,'Veraval','IND',123000), +(1267,'Hoshiarpur','IND',122705), +(1268,'Ambala','IND',122596), +(1269,'Sitapur','IND',121842), +(1270,'Bhiwani','IND',121629), +(1271,'Cuddapah','IND',121463), +(1272,'Bhimavaram','IND',121314), +(1273,'Krishnanagar','IND',121110), +(1274,'Chandannagar','IND',120378), +(1275,'Mandya','IND',120265), +(1276,'Dibrugarh','IND',120127), +(1277,'Nandyal','IND',119813), +(1278,'Balurghat','IND',119796), +(1279,'Neyveli','IND',118080), +(1280,'Fatehpur','IND',117675), +(1281,'Mahbubnagar','IND',116833), +(1282,'Budaun','IND',116695), +(1283,'Porbandar','IND',116671), +(1284,'Silchar','IND',115483), +(1285,'Berhampore (Baharampur)','IND',115144), +(1286,'Purnea (Purnia)','IND',114912), +(1287,'Bankura','IND',114876), +(1288,'Rajapalaiyam','IND',114202), +(1289,'Titagarh','IND',114085), +(1290,'Halisahar','IND',114028), +(1291,'Hathras','IND',113285), +(1292,'Bhir (Bid)','IND',112434), +(1293,'Pallavaram','IND',111866), +(1294,'Anand','IND',110266), +(1295,'Mango','IND',110024), +(1296,'Santipur','IND',109956), +(1297,'Bhind','IND',109755), +(1298,'Gondiya','IND',109470), +(1299,'Tiruvannamalai','IND',109196), +(1300,'Yeotmal (Yavatmal)','IND',108578), +(1301,'Kulti-Barakar','IND',108518), +(1302,'Moga','IND',108304), +(1303,'Shivapuri','IND',108277), +(1304,'Bidar','IND',108016), +(1305,'Guntakal','IND',107592), +(1306,'Unnao','IND',107425), +(1307,'Barasat','IND',107365), +(1308,'Tambaram','IND',107187), +(1309,'Abohar','IND',107163), +(1310,'Pilibhit','IND',106605), +(1311,'Valparai','IND',106523), +(1312,'Gonda','IND',106078), +(1313,'Surendranagar','IND',105973), +(1314,'Qutubullapur','IND',105380), +(1315,'Beawar','IND',105363), +(1316,'Hindupur','IND',104651), +(1317,'Gandhidham','IND',104585), +(1318,'Haldwani-cum-Kathgodam','IND',104195), +(1319,'Tellicherry (Thalassery)','IND',103579), +(1320,'Wardha','IND',102985), +(1321,'Rishra','IND',102649), +(1322,'Bhuj','IND',102176), +(1323,'Modinagar','IND',101660), +(1324,'Gudivada','IND',101656), +(1325,'Basirhat','IND',101409), +(1326,'Uttarpara-Kotrung','IND',100867), +(1327,'Ongole','IND',100836), +(1328,'North Barrackpur','IND',100513), +(1329,'Guna','IND',100490), +(1330,'Haldia','IND',100347), +(1331,'Habra','IND',100223), +(1332,'Kanchrapara','IND',100194), +(1333,'Tonk','IND',100079), +(1334,'Champdani','IND',98818), +(1335,'Orai','IND',98640), +(1336,'Pudukkottai','IND',98619), +(1337,'Sasaram','IND',98220), +(1338,'Hazaribag','IND',97712), +(1339,'Palayankottai','IND',97662), +(1340,'Banda','IND',97227), +(1341,'Godhra','IND',96813), +(1342,'Hospet','IND',96322), +(1343,'Ashoknagar-Kalyangarh','IND',96315), +(1344,'Achalpur','IND',96216), +(1345,'Patan','IND',96109), +(1346,'Mandasor','IND',95758), +(1347,'Damoh','IND',95661), +(1348,'Satara','IND',95133), +(1349,'Meerut Cantonment','IND',94876), +(1350,'Dehri','IND',94526), +(1351,'Delhi Cantonment','IND',94326), +(1352,'Chhindwara','IND',93731), +(1353,'Bansberia','IND',93447), +(1354,'Nagaon','IND',93350), +(1355,'Kanpur Cantonment','IND',93109), +(1356,'Vidisha','IND',92917), +(1357,'Bettiah','IND',92583), +(1358,'Purulia','IND',92574), +(1359,'Hassan','IND',90803), +(1360,'Ambala Sadar','IND',90712), +(1361,'Baidyabati','IND',90601), +(1362,'Morvi','IND',90357), +(1363,'Raigarh','IND',89166), +(1364,'Vejalpur','IND',89053), +(1365,'Baghdad','IRQ',4336000), +(1366,'Mosul','IRQ',879000), +(1367,'Irbil','IRQ',485968), +(1368,'Kirkuk','IRQ',418624), +(1369,'Basra','IRQ',406296), +(1370,'al-Sulaymaniya','IRQ',364096), +(1371,'al-Najaf','IRQ',309010), +(1372,'Karbala','IRQ',296705), +(1373,'al-Hilla','IRQ',268834), +(1374,'al-Nasiriya','IRQ',265937), +(1375,'al-Amara','IRQ',208797), +(1376,'al-Diwaniya','IRQ',196519), +(1377,'al-Ramadi','IRQ',192556), +(1378,'al-Kut','IRQ',183183), +(1379,'Baquba','IRQ',114516), +(1380,'Teheran','IRN',6758845), +(1381,'Mashhad','IRN',1887405), +(1382,'Esfahan','IRN',1266072), +(1383,'Tabriz','IRN',1191043), +(1384,'Shiraz','IRN',1053025), +(1385,'Karaj','IRN',940968), +(1386,'Ahvaz','IRN',804980), +(1387,'Qom','IRN',777677), +(1388,'Kermanshah','IRN',692986), +(1389,'Urmia','IRN',435200), +(1390,'Zahedan','IRN',419518), +(1391,'Rasht','IRN',417748), +(1392,'Hamadan','IRN',401281), +(1393,'Kerman','IRN',384991), +(1394,'Arak','IRN',380755), +(1395,'Ardebil','IRN',340386), +(1396,'Yazd','IRN',326776), +(1397,'Qazvin','IRN',291117), +(1398,'Zanjan','IRN',286295), +(1399,'Sanandaj','IRN',277808), +(1400,'Bandar-e-Abbas','IRN',273578); +INSERT INTO City VALUES +(1401,'Khorramabad','IRN',272815), +(1402,'Eslamshahr','IRN',265450), +(1403,'Borujerd','IRN',217804), +(1404,'Abadan','IRN',206073), +(1405,'Dezful','IRN',202639), +(1406,'Kashan','IRN',201372), +(1407,'Sari','IRN',195882), +(1408,'Gorgan','IRN',188710), +(1409,'Najafabad','IRN',178498), +(1410,'Sabzevar','IRN',170738), +(1411,'Khomeynishahr','IRN',165888), +(1412,'Amol','IRN',159092), +(1413,'Neyshabur','IRN',158847), +(1414,'Babol','IRN',158346), +(1415,'Khoy','IRN',148944), +(1416,'Malayer','IRN',144373), +(1417,'Bushehr','IRN',143641), +(1418,'Qaemshahr','IRN',143286), +(1419,'Qarchak','IRN',142690), +(1420,'Qods','IRN',138278), +(1421,'Sirjan','IRN',135024), +(1422,'Bojnurd','IRN',134835), +(1423,'Maragheh','IRN',132318), +(1424,'Birjand','IRN',127608), +(1425,'Ilam','IRN',126346), +(1426,'Bukan','IRN',120020), +(1427,'Masjed-e-Soleyman','IRN',116883), +(1428,'Saqqez','IRN',115394), +(1429,'Gonbad-e Qabus','IRN',111253), +(1430,'Saveh','IRN',111245), +(1431,'Mahabad','IRN',107799), +(1432,'Varamin','IRN',107233), +(1433,'Andimeshk','IRN',106923), +(1434,'Khorramshahr','IRN',105636), +(1435,'Shahrud','IRN',104765), +(1436,'Marv Dasht','IRN',103579), +(1437,'Zabol','IRN',100887), +(1438,'Shahr-e Kord','IRN',100477), +(1439,'Bandar-e Anzali','IRN',98500), +(1440,'Rafsanjan','IRN',98300), +(1441,'Marand','IRN',96400), +(1442,'Torbat-e Heydariyeh','IRN',94600), +(1443,'Jahrom','IRN',94200), +(1444,'Semnan','IRN',91045), +(1445,'Miandoab','IRN',90100), +(1446,'Qomsheh','IRN',89800), +(1447,'Dublin','IRL',481854), +(1448,'Cork','IRL',127187), +(1449,'Reykjavík','ISL',109184), +(1450,'Jerusalem','ISR',633700), +(1451,'Tel Aviv-Jaffa','ISR',348100), +(1452,'Haifa','ISR',265700), +(1453,'Rishon Le Ziyyon','ISR',188200), +(1454,'Beerseba','ISR',163700), +(1455,'Holon','ISR',163100), +(1456,'Petah Tiqwa','ISR',159400), +(1457,'Ashdod','ISR',155800), +(1458,'Netanya','ISR',154900), +(1459,'Bat Yam','ISR',137000), +(1460,'Bene Beraq','ISR',133900), +(1461,'Ramat Gan','ISR',126900), +(1462,'Ashqelon','ISR',92300), +(1463,'Rehovot','ISR',90300), +(1464,'Roma','ITA',2643581), +(1465,'Milano','ITA',1300977), +(1466,'Napoli','ITA',1002619), +(1467,'Torino','ITA',903705), +(1468,'Palermo','ITA',683794), +(1469,'Genova','ITA',636104), +(1470,'Bologna','ITA',381161), +(1471,'Firenze','ITA',376662), +(1472,'Catania','ITA',337862), +(1473,'Bari','ITA',331848), +(1474,'Venezia','ITA',277305), +(1475,'Messina','ITA',259156), +(1476,'Verona','ITA',255268), +(1477,'Trieste','ITA',216459), +(1478,'Padova','ITA',211391), +(1479,'Taranto','ITA',208214), +(1480,'Brescia','ITA',191317), +(1481,'Reggio di Calabria','ITA',179617), +(1482,'Modena','ITA',176022), +(1483,'Prato','ITA',172473), +(1484,'Parma','ITA',168717), +(1485,'Cagliari','ITA',165926), +(1486,'Livorno','ITA',161673), +(1487,'Perugia','ITA',156673), +(1488,'Foggia','ITA',154891), +(1489,'Reggio nell´ Emilia','ITA',143664), +(1490,'Salerno','ITA',142055), +(1491,'Ravenna','ITA',138418), +(1492,'Ferrara','ITA',132127), +(1493,'Rimini','ITA',131062), +(1494,'Syrakusa','ITA',126282), +(1495,'Sassari','ITA',120803), +(1496,'Monza','ITA',119516), +(1497,'Bergamo','ITA',117837), +(1498,'Pescara','ITA',115698), +(1499,'Latina','ITA',114099), +(1500,'Vicenza','ITA',109738), +(1501,'Terni','ITA',107770), +(1502,'Forlì','ITA',107475), +(1503,'Trento','ITA',104906), +(1504,'Novara','ITA',102037), +(1505,'Piacenza','ITA',98384), +(1506,'Ancona','ITA',98329), +(1507,'Lecce','ITA',98208), +(1508,'Bolzano','ITA',97232), +(1509,'Catanzaro','ITA',96700), +(1510,'La Spezia','ITA',95504), +(1511,'Udine','ITA',94932), +(1512,'Torre del Greco','ITA',94505), +(1513,'Andria','ITA',94443), +(1514,'Brindisi','ITA',93454), +(1515,'Giugliano in Campania','ITA',93286), +(1516,'Pisa','ITA',92379), +(1517,'Barletta','ITA',91904), +(1518,'Arezzo','ITA',91729), +(1519,'Alessandria','ITA',90289), +(1520,'Cesena','ITA',89852), +(1521,'Pesaro','ITA',88987), +(1522,'Dili','TMP',47900), +(1523,'Wien','AUT',1608144), +(1524,'Graz','AUT',240967), +(1525,'Linz','AUT',188022), +(1526,'Salzburg','AUT',144247), +(1527,'Innsbruck','AUT',111752), +(1528,'Klagenfurt','AUT',91141), +(1529,'Spanish Town','JAM',110379), +(1530,'Kingston','JAM',103962), +(1531,'Portmore','JAM',99799), +(1532,'Tokyo','JPN',7980230), +(1533,'Jokohama [Yokohama]','JPN',3339594), +(1534,'Osaka','JPN',2595674), +(1535,'Nagoya','JPN',2154376), +(1536,'Sapporo','JPN',1790886), +(1537,'Kioto','JPN',1461974), +(1538,'Kobe','JPN',1425139), +(1539,'Fukuoka','JPN',1308379), +(1540,'Kawasaki','JPN',1217359), +(1541,'Hiroshima','JPN',1119117), +(1542,'Kitakyushu','JPN',1016264), +(1543,'Sendai','JPN',989975), +(1544,'Chiba','JPN',863930), +(1545,'Sakai','JPN',797735), +(1546,'Kumamoto','JPN',656734), +(1547,'Okayama','JPN',624269), +(1548,'Sagamihara','JPN',586300), +(1549,'Hamamatsu','JPN',568796), +(1550,'Kagoshima','JPN',549977), +(1551,'Funabashi','JPN',545299), +(1552,'Higashiosaka','JPN',517785), +(1553,'Hachioji','JPN',513451), +(1554,'Niigata','JPN',497464), +(1555,'Amagasaki','JPN',481434), +(1556,'Himeji','JPN',475167), +(1557,'Shizuoka','JPN',473854), +(1558,'Urawa','JPN',469675), +(1559,'Matsuyama','JPN',466133), +(1560,'Matsudo','JPN',461126), +(1561,'Kanazawa','JPN',455386), +(1562,'Kawaguchi','JPN',452155), +(1563,'Ichikawa','JPN',441893), +(1564,'Omiya','JPN',441649), +(1565,'Utsunomiya','JPN',440353), +(1566,'Oita','JPN',433401), +(1567,'Nagasaki','JPN',432759), +(1568,'Yokosuka','JPN',430200), +(1569,'Kurashiki','JPN',425103), +(1570,'Gifu','JPN',408007), +(1571,'Hirakata','JPN',403151), +(1572,'Nishinomiya','JPN',397618), +(1573,'Toyonaka','JPN',396689), +(1574,'Wakayama','JPN',391233), +(1575,'Fukuyama','JPN',376921), +(1576,'Fujisawa','JPN',372840), +(1577,'Asahikawa','JPN',364813), +(1578,'Machida','JPN',364197), +(1579,'Nara','JPN',362812), +(1580,'Takatsuki','JPN',361747), +(1581,'Iwaki','JPN',361737), +(1582,'Nagano','JPN',361391), +(1583,'Toyohashi','JPN',360066), +(1584,'Toyota','JPN',346090), +(1585,'Suita','JPN',345750), +(1586,'Takamatsu','JPN',332471), +(1587,'Koriyama','JPN',330335), +(1588,'Okazaki','JPN',328711), +(1589,'Kawagoe','JPN',327211), +(1590,'Tokorozawa','JPN',325809), +(1591,'Toyama','JPN',325790), +(1592,'Kochi','JPN',324710), +(1593,'Kashiwa','JPN',320296), +(1594,'Akita','JPN',314440), +(1595,'Miyazaki','JPN',303784), +(1596,'Koshigaya','JPN',301446), +(1597,'Naha','JPN',299851), +(1598,'Aomori','JPN',295969), +(1599,'Hakodate','JPN',294788), +(1600,'Akashi','JPN',292253); +INSERT INTO City VALUES +(1601,'Yokkaichi','JPN',288173), +(1602,'Fukushima','JPN',287525), +(1603,'Morioka','JPN',287353), +(1604,'Maebashi','JPN',284473), +(1605,'Kasugai','JPN',282348), +(1606,'Otsu','JPN',282070), +(1607,'Ichihara','JPN',279280), +(1608,'Yao','JPN',276421), +(1609,'Ichinomiya','JPN',270828), +(1610,'Tokushima','JPN',269649), +(1611,'Kakogawa','JPN',266281), +(1612,'Ibaraki','JPN',261020), +(1613,'Neyagawa','JPN',257315), +(1614,'Shimonoseki','JPN',257263), +(1615,'Yamagata','JPN',255617), +(1616,'Fukui','JPN',254818), +(1617,'Hiratsuka','JPN',254207), +(1618,'Mito','JPN',246559), +(1619,'Sasebo','JPN',244240), +(1620,'Hachinohe','JPN',242979), +(1621,'Takasaki','JPN',239124), +(1622,'Shimizu','JPN',239123), +(1623,'Kurume','JPN',235611), +(1624,'Fuji','JPN',231527), +(1625,'Soka','JPN',222768), +(1626,'Fuchu','JPN',220576), +(1627,'Chigasaki','JPN',216015), +(1628,'Atsugi','JPN',212407), +(1629,'Numazu','JPN',211382), +(1630,'Ageo','JPN',209442), +(1631,'Yamato','JPN',208234), +(1632,'Matsumoto','JPN',206801), +(1633,'Kure','JPN',206504), +(1634,'Takarazuka','JPN',205993), +(1635,'Kasukabe','JPN',201838), +(1636,'Chofu','JPN',201585), +(1637,'Odawara','JPN',200171), +(1638,'Kofu','JPN',199753), +(1639,'Kushiro','JPN',197608), +(1640,'Kishiwada','JPN',197276), +(1641,'Hitachi','JPN',196622), +(1642,'Nagaoka','JPN',192407), +(1643,'Itami','JPN',190886), +(1644,'Uji','JPN',188735), +(1645,'Suzuka','JPN',184061), +(1646,'Hirosaki','JPN',177522), +(1647,'Ube','JPN',175206), +(1648,'Kodaira','JPN',174984), +(1649,'Takaoka','JPN',174380), +(1650,'Obihiro','JPN',173685), +(1651,'Tomakomai','JPN',171958), +(1652,'Saga','JPN',170034), +(1653,'Sakura','JPN',168072), +(1654,'Kamakura','JPN',167661), +(1655,'Mitaka','JPN',167268), +(1656,'Izumi','JPN',166979), +(1657,'Hino','JPN',166770), +(1658,'Hadano','JPN',166512), +(1659,'Ashikaga','JPN',165243), +(1660,'Tsu','JPN',164543), +(1661,'Sayama','JPN',162472), +(1662,'Yachiyo','JPN',161222), +(1663,'Tsukuba','JPN',160768), +(1664,'Tachikawa','JPN',159430), +(1665,'Kumagaya','JPN',157171), +(1666,'Moriguchi','JPN',155941), +(1667,'Otaru','JPN',155784), +(1668,'Anjo','JPN',153823), +(1669,'Narashino','JPN',152849), +(1670,'Oyama','JPN',152820), +(1671,'Ogaki','JPN',151758), +(1672,'Matsue','JPN',149821), +(1673,'Kawanishi','JPN',149794), +(1674,'Hitachinaka','JPN',148006), +(1675,'Niiza','JPN',147744), +(1676,'Nagareyama','JPN',147738), +(1677,'Tottori','JPN',147523), +(1678,'Tama','JPN',146712), +(1679,'Iruma','JPN',145922), +(1680,'Ota','JPN',145317), +(1681,'Omuta','JPN',142889), +(1682,'Komaki','JPN',139827), +(1683,'Ome','JPN',139216), +(1684,'Kadoma','JPN',138953), +(1685,'Yamaguchi','JPN',138210), +(1686,'Higashimurayama','JPN',136970), +(1687,'Yonago','JPN',136461), +(1688,'Matsubara','JPN',135010), +(1689,'Musashino','JPN',134426), +(1690,'Tsuchiura','JPN',134072), +(1691,'Joetsu','JPN',133505), +(1692,'Miyakonojo','JPN',133183), +(1693,'Misato','JPN',132957), +(1694,'Kakamigahara','JPN',131831), +(1695,'Daito','JPN',130594), +(1696,'Seto','JPN',130470), +(1697,'Kariya','JPN',127969), +(1698,'Urayasu','JPN',127550), +(1699,'Beppu','JPN',127486), +(1700,'Niihama','JPN',127207), +(1701,'Minoo','JPN',127026), +(1702,'Fujieda','JPN',126897), +(1703,'Abiko','JPN',126670), +(1704,'Nobeoka','JPN',125547), +(1705,'Tondabayashi','JPN',125094), +(1706,'Ueda','JPN',124217), +(1707,'Kashihara','JPN',124013), +(1708,'Matsusaka','JPN',123582), +(1709,'Isesaki','JPN',123285), +(1710,'Zama','JPN',122046), +(1711,'Kisarazu','JPN',121967), +(1712,'Noda','JPN',121030), +(1713,'Ishinomaki','JPN',120963), +(1714,'Fujinomiya','JPN',119714), +(1715,'Kawachinagano','JPN',119666), +(1716,'Imabari','JPN',119357), +(1717,'Aizuwakamatsu','JPN',119287), +(1718,'Higashihiroshima','JPN',119166), +(1719,'Habikino','JPN',118968), +(1720,'Ebetsu','JPN',118805), +(1721,'Hofu','JPN',118751), +(1722,'Kiryu','JPN',118326), +(1723,'Okinawa','JPN',117748), +(1724,'Yaizu','JPN',117258), +(1725,'Toyokawa','JPN',115781), +(1726,'Ebina','JPN',115571), +(1727,'Asaka','JPN',114815), +(1728,'Higashikurume','JPN',111666), +(1729,'Ikoma','JPN',111645), +(1730,'Kitami','JPN',111295), +(1731,'Koganei','JPN',110969), +(1732,'Iwatsuki','JPN',110034), +(1733,'Mishima','JPN',109699), +(1734,'Handa','JPN',108600), +(1735,'Muroran','JPN',108275), +(1736,'Komatsu','JPN',107937), +(1737,'Yatsushiro','JPN',107661), +(1738,'Iida','JPN',107583), +(1739,'Tokuyama','JPN',107078), +(1740,'Kokubunji','JPN',106996), +(1741,'Akishima','JPN',106914), +(1742,'Iwakuni','JPN',106647), +(1743,'Kusatsu','JPN',106232), +(1744,'Kuwana','JPN',106121), +(1745,'Sanda','JPN',105643), +(1746,'Hikone','JPN',105508), +(1747,'Toda','JPN',103969), +(1748,'Tajimi','JPN',103171), +(1749,'Ikeda','JPN',102710), +(1750,'Fukaya','JPN',102156), +(1751,'Ise','JPN',101732), +(1752,'Sakata','JPN',101651), +(1753,'Kasuga','JPN',101344), +(1754,'Kamagaya','JPN',100821), +(1755,'Tsuruoka','JPN',100713), +(1756,'Hoya','JPN',100313), +(1757,'Nishio','JPN',100032), +(1758,'Tokai','JPN',99738), +(1759,'Inazawa','JPN',98746), +(1760,'Sakado','JPN',98221), +(1761,'Isehara','JPN',98123), +(1762,'Takasago','JPN',97632), +(1763,'Fujimi','JPN',96972), +(1764,'Urasoe','JPN',96002), +(1765,'Yonezawa','JPN',95592), +(1766,'Konan','JPN',95521), +(1767,'Yamatokoriyama','JPN',95165), +(1768,'Maizuru','JPN',94784), +(1769,'Onomichi','JPN',93756), +(1770,'Higashimatsuyama','JPN',93342), +(1771,'Kimitsu','JPN',93216), +(1772,'Isahaya','JPN',93058), +(1773,'Kanuma','JPN',93053), +(1774,'Izumisano','JPN',92583), +(1775,'Kameoka','JPN',92398), +(1776,'Mobara','JPN',91664), +(1777,'Narita','JPN',91470), +(1778,'Kashiwazaki','JPN',91229), +(1779,'Tsuyama','JPN',91170), +(1780,'Sanaa','YEM',503600), +(1781,'Aden','YEM',398300), +(1782,'Taizz','YEM',317600), +(1783,'Hodeida','YEM',298500), +(1784,'al-Mukalla','YEM',122400), +(1785,'Ibb','YEM',103300), +(1786,'Amman','JOR',1000000), +(1787,'al-Zarqa','JOR',389815), +(1788,'Irbid','JOR',231511), +(1789,'al-Rusayfa','JOR',137247), +(1790,'Wadi al-Sir','JOR',89104), +(1791,'Flying Fish Cove','CXR',700), +(1792,'Beograd','YUG',1204000), +(1793,'Novi Sad','YUG',179626), +(1794,'Ni','YUG',175391), +(1795,'Pritina','YUG',155496), +(1796,'Kragujevac','YUG',147305), +(1797,'Podgorica','YUG',135000), +(1798,'Subotica','YUG',100386), +(1799,'Prizren','YUG',92303), +(1800,'Phnom Penh','KHM',570155); +INSERT INTO City VALUES +(1801,'Battambang','KHM',129800), +(1802,'Siem Reap','KHM',105100), +(1803,'Douala','CMR',1448300), +(1804,'Yaoundé','CMR',1372800), +(1805,'Garoua','CMR',177000), +(1806,'Maroua','CMR',143000), +(1807,'Bamenda','CMR',138000), +(1808,'Bafoussam','CMR',131000), +(1809,'Nkongsamba','CMR',112454), +(1810,'Montréal','CAN',1016376), +(1811,'Calgary','CAN',768082), +(1812,'Toronto','CAN',688275), +(1813,'North York','CAN',622632), +(1814,'Winnipeg','CAN',618477), +(1815,'Edmonton','CAN',616306), +(1816,'Mississauga','CAN',608072), +(1817,'Scarborough','CAN',594501), +(1818,'Vancouver','CAN',514008), +(1819,'Etobicoke','CAN',348845), +(1820,'London','CAN',339917), +(1821,'Hamilton','CAN',335614), +(1822,'Ottawa','CAN',335277), +(1823,'Laval','CAN',330393), +(1824,'Surrey','CAN',304477), +(1825,'Brampton','CAN',296711), +(1826,'Windsor','CAN',207588), +(1827,'Saskatoon','CAN',193647), +(1828,'Kitchener','CAN',189959), +(1829,'Markham','CAN',189098), +(1830,'Regina','CAN',180400), +(1831,'Burnaby','CAN',179209), +(1832,'Québec','CAN',167264), +(1833,'York','CAN',154980), +(1834,'Richmond','CAN',148867), +(1835,'Vaughan','CAN',147889), +(1836,'Burlington','CAN',145150), +(1837,'Oshawa','CAN',140173), +(1838,'Oakville','CAN',139192), +(1839,'Saint Catharines','CAN',136216), +(1840,'Longueuil','CAN',127977), +(1841,'Richmond Hill','CAN',116428), +(1842,'Thunder Bay','CAN',115913), +(1843,'Nepean','CAN',115100), +(1844,'Cape Breton','CAN',114733), +(1845,'East York','CAN',114034), +(1846,'Halifax','CAN',113910), +(1847,'Cambridge','CAN',109186), +(1848,'Gloucester','CAN',107314), +(1849,'Abbotsford','CAN',105403), +(1850,'Guelph','CAN',103593), +(1851,'Saint John´s','CAN',101936), +(1852,'Coquitlam','CAN',101820), +(1853,'Saanich','CAN',101388), +(1854,'Gatineau','CAN',100702), +(1855,'Delta','CAN',95411), +(1856,'Sudbury','CAN',92686), +(1857,'Kelowna','CAN',89442), +(1858,'Barrie','CAN',89269), +(1859,'Praia','CPV',94800), +(1860,'Almaty','KAZ',1129400), +(1861,'Qaraghandy','KAZ',436900), +(1862,'Shymkent','KAZ',360100), +(1863,'Taraz','KAZ',330100), +(1864,'Astana','KAZ',311200), +(1865,'Öskemen','KAZ',311000), +(1866,'Pavlodar','KAZ',300500), +(1867,'Semey','KAZ',269600), +(1868,'Aqtöbe','KAZ',253100), +(1869,'Qostanay','KAZ',221400), +(1870,'Petropavl','KAZ',203500), +(1871,'Oral','KAZ',195500), +(1872,'Temirtau','KAZ',170500), +(1873,'Qyzylorda','KAZ',157400), +(1874,'Aqtau','KAZ',143400), +(1875,'Atyrau','KAZ',142500), +(1876,'Ekibastuz','KAZ',127200), +(1877,'Kökshetau','KAZ',123400), +(1878,'Rudnyy','KAZ',109500), +(1879,'Taldyqorghan','KAZ',98000), +(1880,'Zhezqazghan','KAZ',90000), +(1881,'Nairobi','KEN',2290000), +(1882,'Mombasa','KEN',461753), +(1883,'Kisumu','KEN',192733), +(1884,'Nakuru','KEN',163927), +(1885,'Machakos','KEN',116293), +(1886,'Eldoret','KEN',111882), +(1887,'Meru','KEN',94947), +(1888,'Nyeri','KEN',91258), +(1889,'Bangui','CAF',524000), +(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,'Urumti [Ü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), +(1925,'Baotou','CHN',980000), +(1926,'Shenzhen','CHN',950500), +(1927,'Hohhot','CHN',916700), +(1928,'Handan','CHN',840000), +(1929,'Wuxi','CHN',830000), +(1930,'Xuzhou','CHN',810000), +(1931,'Datong','CHN',800000), +(1932,'Yichun','CHN',800000), +(1933,'Benxi','CHN',770000), +(1934,'Luoyang','CHN',760000), +(1935,'Suzhou','CHN',710000), +(1936,'Xining','CHN',700200), +(1937,'Huainan','CHN',700000), +(1938,'Jixi','CHN',683885), +(1939,'Daqing','CHN',660000), +(1940,'Fuxin','CHN',640000), +(1941,'Amoy [Xiamen]','CHN',627500), +(1942,'Liuzhou','CHN',610000), +(1943,'Shantou','CHN',580000), +(1944,'Jinzhou','CHN',570000), +(1945,'Mudanjiang','CHN',570000), +(1946,'Yinchuan','CHN',544500), +(1947,'Changzhou','CHN',530000), +(1948,'Zhangjiakou','CHN',530000), +(1949,'Dandong','CHN',520000), +(1950,'Hegang','CHN',520000), +(1951,'Kaifeng','CHN',510000), +(1952,'Jiamusi','CHN',493409), +(1953,'Liaoyang','CHN',492559), +(1954,'Hengyang','CHN',487148), +(1955,'Baoding','CHN',483155), +(1956,'Hunjiang','CHN',482043), +(1957,'Xinxiang','CHN',473762), +(1958,'Huangshi','CHN',457601), +(1959,'Haikou','CHN',454300), +(1960,'Yantai','CHN',452127), +(1961,'Bengbu','CHN',449245), +(1962,'Xiangtan','CHN',441968), +(1963,'Weifang','CHN',428522), + (1964,'Wuhu','CHN',425740), +(1965,'Pingxiang','CHN',425579), +(1966,'Yingkou','CHN',421589), +(1967,'Anyang','CHN',420332), +(1968,'Panzhihua','CHN',415466), +(1969,'Pingdingshan','CHN',410775), +(1970,'Xiangfan','CHN',410407), +(1971,'Zhuzhou','CHN',409924), +(1972,'Jiaozuo','CHN',409100), +(1973,'Wenzhou','CHN',401871), +(1974,'Zhangjiang','CHN',400997), +(1975,'Zigong','CHN',393184), +(1976,'Shuangyashan','CHN',386081), +(1977,'Zaozhuang','CHN',380846), +(1978,'Yakeshi','CHN',377869), +(1979,'Yichang','CHN',371601), +(1980,'Zhenjiang','CHN',368316), +(1981,'Huaibei','CHN',366549), +(1982,'Qinhuangdao','CHN',364972), +(1983,'Guilin','CHN',364130), +(1984,'Liupanshui','CHN',363954), +(1985,'Panjin','CHN',362773), +(1986,'Yangquan','CHN',362268), +(1987,'Jinxi','CHN',357052), +(1988,'Liaoyuan','CHN',354141), +(1989,'Lianyungang','CHN',354139), +(1990,'Xianyang','CHN',352125), +(1991,'Tai´an','CHN',350696), +(1992,'Chifeng','CHN',350077), +(1993,'Shaoguan','CHN',350043), +(1994,'Nantong','CHN',343341), +(1995,'Leshan','CHN',341128), +(1996,'Baoji','CHN',337765), +(1997,'Linyi','CHN',324720), +(1998,'Tonghua','CHN',324600), +(1999,'Siping','CHN',317223), +(2000,'Changzhi','CHN',317144); +INSERT INTO City VALUES +(2001,'Tengzhou','CHN',315083), +(2002,'Chaozhou','CHN',313469), +(2003,'Yangzhou','CHN',312892), +(2004,'Dongwan','CHN',308669), +(2005,'Ma´anshan','CHN',305421), +(2006,'Foshan','CHN',303160), +(2007,'Yueyang','CHN',302800), +(2008,'Xingtai','CHN',302789), +(2009,'Changde','CHN',301276), +(2010,'Shihezi','CHN',299676), +(2011,'Yancheng','CHN',296831), +(2012,'Jiujiang','CHN',291187), +(2013,'Dongying','CHN',281728), +(2014,'Shashi','CHN',281352), +(2015,'Xintai','CHN',281248), +(2016,'Jingdezhen','CHN',281183), +(2017,'Tongchuan','CHN',280657), +(2018,'Zhongshan','CHN',278829), +(2019,'Shiyan','CHN',273786), +(2020,'Tieli','CHN',265683), +(2021,'Jining','CHN',265248), +(2022,'Wuhai','CHN',264081), +(2023,'Mianyang','CHN',262947), +(2024,'Luzhou','CHN',262892), +(2025,'Zunyi','CHN',261862), +(2026,'Shizuishan','CHN',257862), +(2027,'Neijiang','CHN',256012), +(2028,'Tongliao','CHN',255129), +(2029,'Tieling','CHN',254842), +(2030,'Wafangdian','CHN',251733), +(2031,'Anqing','CHN',250718), +(2032,'Shaoyang','CHN',247227), +(2033,'Laiwu','CHN',246833), +(2034,'Chengde','CHN',246799), +(2035,'Tianshui','CHN',244974), +(2036,'Nanyang','CHN',243303), +(2037,'Cangzhou','CHN',242708), +(2038,'Yibin','CHN',241019), +(2039,'Huaiyin','CHN',239675), +(2040,'Dunhua','CHN',235100), +(2041,'Yanji','CHN',230892), +(2042,'Jiangmen','CHN',230587), +(2043,'Tongling','CHN',228017), +(2044,'Suihua','CHN',227881), +(2045,'Gongziling','CHN',226569), +(2046,'Xiantao','CHN',222884), +(2047,'Chaoyang','CHN',222394), +(2048,'Ganzhou','CHN',220129), +(2049,'Huzhou','CHN',218071), +(2050,'Baicheng','CHN',217987), +(2051,'Shangzi','CHN',215373), +(2052,'Yangjiang','CHN',215196), +(2053,'Qitaihe','CHN',214957), +(2054,'Gejiu','CHN',214294), +(2055,'Jiangyin','CHN',213659), +(2056,'Hebi','CHN',212976), +(2057,'Jiaxing','CHN',211526), +(2058,'Wuzhou','CHN',210452), +(2059,'Meihekou','CHN',209038), +(2060,'Xuchang','CHN',208815), +(2061,'Liaocheng','CHN',207844), +(2062,'Haicheng','CHN',205560), +(2063,'Qianjiang','CHN',205504), +(2064,'Baiyin','CHN',204970), +(2065,'Bei´an','CHN',204899), +(2066,'Yixing','CHN',200824), +(2067,'Laizhou','CHN',198664), +(2068,'Qaramay','CHN',197602), +(2069,'Acheng','CHN',197595), +(2070,'Dezhou','CHN',195485), +(2071,'Nanping','CHN',195064), +(2072,'Zhaoqing','CHN',194784), +(2073,'Beipiao','CHN',194301), +(2074,'Fengcheng','CHN',193784), +(2075,'Fuyu','CHN',192981), +(2076,'Xinyang','CHN',192509), +(2077,'Dongtai','CHN',192247), +(2078,'Yuci','CHN',191356), +(2079,'Honghu','CHN',190772), +(2080,'Ezhou','CHN',190123), +(2081,'Heze','CHN',189293), +(2082,'Daxian','CHN',188101), +(2083,'Linfen','CHN',187309), +(2084,'Tianmen','CHN',186332), +(2085,'Yiyang','CHN',185818), +(2086,'Quanzhou','CHN',185154), +(2087,'Rizhao','CHN',185048), +(2088,'Deyang','CHN',182488), +(2089,'Guangyuan','CHN',182241), +(2090,'Changshu','CHN',181805), +(2091,'Zhangzhou','CHN',181424), +(2092,'Hailar','CHN',180650), +(2093,'Nanchong','CHN',180273), +(2094,'Jiutai','CHN',180130), +(2095,'Zhaodong','CHN',179976), +(2096,'Shaoxing','CHN',179818), +(2097,'Fuyang','CHN',179572), +(2098,'Maoming','CHN',178683), +(2099,'Qujing','CHN',178669), +(2100,'Ghulja','CHN',177193), +(2101,'Jiaohe','CHN',176367), +(2102,'Puyang','CHN',175988), +(2103,'Huadian','CHN',175873), +(2104,'Jiangyou','CHN',175753), +(2105,'Qashqar','CHN',174570), +(2106,'Anshun','CHN',174142), +(2107,'Fuling','CHN',173878), +(2108,'Xinyu','CHN',173524), +(2109,'Hanzhong','CHN',169930), +(2110,'Danyang','CHN',169603), +(2111,'Chenzhou','CHN',169400), +(2112,'Xiaogan','CHN',166280), +(2113,'Shangqiu','CHN',164880), +(2114,'Zhuhai','CHN',164747), +(2115,'Qingyuan','CHN',164641), +(2116,'Aqsu','CHN',164092), +(2117,'Jining','CHN',163552), +(2118,'Xiaoshan','CHN',162930), +(2119,'Zaoyang','CHN',162198), +(2120,'Xinghua','CHN',161910), +(2121,'Hami','CHN',161315), +(2122,'Huizhou','CHN',161023), +(2123,'Jinmen','CHN',160794), +(2124,'Sanming','CHN',160691), +(2125,'Ulanhot','CHN',159538), +(2126,'Korla','CHN',159344), +(2127,'Wanxian','CHN',156823), +(2128,'Rui´an','CHN',156468), +(2129,'Zhoushan','CHN',156317), +(2130,'Liangcheng','CHN',156307), +(2131,'Jiaozhou','CHN',153364), +(2132,'Taizhou','CHN',152442), +(2133,'Suzhou','CHN',151862), +(2134,'Yichun','CHN',151585), +(2135,'Taonan','CHN',150168), +(2136,'Pingdu','CHN',150123), +(2137,'Ji´an','CHN',148583), +(2138,'Longkou','CHN',148362), +(2139,'Langfang','CHN',148105), +(2140,'Zhoukou','CHN',146288), +(2141,'Suining','CHN',146086), +(2142,'Yulin','CHN',144467), +(2143,'Jinhua','CHN',144280), +(2144,'Liu´an','CHN',144248), +(2145,'Shuangcheng','CHN',142659), +(2146,'Suizhou','CHN',142302), +(2147,'Ankang','CHN',142170), +(2148,'Weinan','CHN',140169), +(2149,'Longjing','CHN',139417), +(2150,'Da´an','CHN',138963), +(2151,'Lengshuijiang','CHN',137994), +(2152,'Laiyang','CHN',137080), +(2153,'Xianning','CHN',136811), +(2154,'Dali','CHN',136554), +(2155,'Anda','CHN',136446), +(2156,'Jincheng','CHN',136396), +(2157,'Longyan','CHN',134481), +(2158,'Xichang','CHN',134419), +(2159,'Wendeng','CHN',133910), +(2160,'Hailun','CHN',133565), +(2161,'Binzhou','CHN',133555), +(2162,'Linhe','CHN',133183), +(2163,'Wuwei','CHN',133101), +(2164,'Duyun','CHN',132971), +(2165,'Mishan','CHN',132744), +(2166,'Shangrao','CHN',132455), +(2167,'Changji','CHN',132260), +(2168,'Meixian','CHN',132156), +(2169,'Yushu','CHN',131861), +(2170,'Tiefa','CHN',131807), +(2171,'Huai´an','CHN',131149), +(2172,'Leiyang','CHN',130115), +(2173,'Zalantun','CHN',130031), +(2174,'Weihai','CHN',128888), +(2175,'Loudi','CHN',128418), +(2176,'Qingzhou','CHN',128258), +(2177,'Qidong','CHN',126872), +(2178,'Huaihua','CHN',126785), +(2179,'Luohe','CHN',126438), +(2180,'Chuzhou','CHN',125341), +(2181,'Kaiyuan','CHN',124219), +(2182,'Linqing','CHN',123958), +(2183,'Chaohu','CHN',123676), +(2184,'Laohekou','CHN',123366), +(2185,'Dujiangyan','CHN',123357), +(2186,'Zhumadian','CHN',123232), +(2187,'Linchuan','CHN',121949), +(2188,'Jiaonan','CHN',121397), +(2189,'Sanmenxia','CHN',120523), +(2190,'Heyuan','CHN',120101), +(2191,'Manzhouli','CHN',120023), +(2192,'Lhasa','CHN',120000), +(2193,'Lianyuan','CHN',118858), +(2194,'Kuytun','CHN',118553), +(2195,'Puqi','CHN',117264), +(2196,'Hongjiang','CHN',116188), +(2197,'Qinzhou','CHN',114586), +(2198,'Renqiu','CHN',114256), +(2199,'Yuyao','CHN',114065), +(2200,'Guigang','CHN',114025); +INSERT INTO City VALUES +(2201,'Kaili','CHN',113958), +(2202,'Yan´an','CHN',113277), +(2203,'Beihai','CHN',112673), +(2204,'Xuangzhou','CHN',112673), +(2205,'Quzhou','CHN',112373), +(2206,'Yong´an','CHN',111762), +(2207,'Zixing','CHN',110048), +(2208,'Liyang','CHN',109520), +(2209,'Yizheng','CHN',109268), +(2210,'Yumen','CHN',109234), +(2211,'Liling','CHN',108504), +(2212,'Yuncheng','CHN',108359), +(2213,'Shanwei','CHN',107847), +(2214,'Cixi','CHN',107329), +(2215,'Yuanjiang','CHN',107004), +(2216,'Bozhou','CHN',106346), +(2217,'Jinchang','CHN',105287), +(2218,'Fu´an','CHN',105265), +(2219,'Suqian','CHN',105021), +(2220,'Shishou','CHN',104571), +(2221,'Hengshui','CHN',104269), +(2222,'Danjiangkou','CHN',103211), +(2223,'Fujin','CHN',103104), +(2224,'Sanya','CHN',102820), +(2225,'Guangshui','CHN',102770), +(2226,'Huangshan','CHN',102628), +(2227,'Xingcheng','CHN',102384), +(2228,'Zhucheng','CHN',102134), +(2229,'Kunshan','CHN',102052), +(2230,'Haining','CHN',100478), +(2231,'Pingliang','CHN',99265), +(2232,'Fuqing','CHN',99193), +(2233,'Xinzhou','CHN',98667), +(2234,'Jieyang','CHN',98531), +(2235,'Zhangjiagang','CHN',97994), +(2236,'Tong Xian','CHN',97168), +(2237,'Ya´an','CHN',95900), +(2238,'Jinzhou','CHN',95761), +(2239,'Emeishan','CHN',94000), +(2240,'Enshi','CHN',93056), +(2241,'Bose','CHN',93009), +(2242,'Yuzhou','CHN',92889), +(2243,'Kaiyuan','CHN',91999), +(2244,'Tumen','CHN',91471), +(2245,'Putian','CHN',91030), +(2246,'Linhai','CHN',90870), +(2247,'Xilin Hot','CHN',90646), +(2248,'Shaowu','CHN',90286), +(2249,'Junan','CHN',90222), +(2250,'Huaying','CHN',89400), +(2251,'Pingyi','CHN',89373), +(2252,'Huangyan','CHN',89288), +(2253,'Bishkek','KGZ',589400), +(2254,'Osh','KGZ',222700), +(2255,'Bikenibeu','KIR',5055), +(2256,'Bairiki','KIR',2226), +(2257,'Santafé de Bogotá','COL',6260862), +(2258,'Cali','COL',2077386), +(2259,'Medellín','COL',1861265), +(2260,'Barranquilla','COL',1223260), +(2261,'Cartagena','COL',805757), +(2262,'Cúcuta','COL',606932), +(2263,'Bucaramanga','COL',515555), +(2264,'Ibagué','COL',393664), +(2265,'Pereira','COL',381725), +(2266,'Santa Marta','COL',359147), +(2267,'Manizales','COL',337580), +(2268,'Bello','COL',333470), +(2269,'Pasto','COL',332396), +(2270,'Neiva','COL',300052), +(2271,'Soledad','COL',295058), +(2272,'Armenia','COL',288977), +(2273,'Villavicencio','COL',273140), +(2274,'Soacha','COL',272058), +(2275,'Valledupar','COL',263247), +(2276,'Montería','COL',248245), +(2277,'Itagüí','COL',228985), +(2278,'Palmira','COL',226509), +(2279,'Buenaventura','COL',224336), +(2280,'Floridablanca','COL',221913), +(2281,'Sincelejo','COL',220704), +(2282,'Popayán','COL',200719), +(2283,'Barrancabermeja','COL',178020), +(2284,'Dos Quebradas','COL',159363), +(2285,'Tuluá','COL',152488), +(2286,'Envigado','COL',135848), +(2287,'Cartago','COL',125884), +(2288,'Girardot','COL',110963), +(2289,'Buga','COL',110699), +(2290,'Tunja','COL',109740), +(2291,'Florencia','COL',108574), +(2292,'Maicao','COL',108053), +(2293,'Sogamoso','COL',107728), +(2294,'Giron','COL',90688), +(2295,'Moroni','COM',36000), +(2296,'Brazzaville','COG',950000), +(2297,'Pointe-Noire','COG',500000), +(2298,'Kinshasa','COD',5064000), +(2299,'Lubumbashi','COD',851381), +(2300,'Mbuji-Mayi','COD',806475), +(2301,'Kolwezi','COD',417810), +(2302,'Kisangani','COD',417517), +(2303,'Kananga','COD',393030), +(2304,'Likasi','COD',299118), +(2305,'Bukavu','COD',201569), +(2306,'Kikwit','COD',182142), +(2307,'Tshikapa','COD',180860), +(2308,'Matadi','COD',172730), +(2309,'Mbandaka','COD',169841), +(2310,'Mwene-Ditu','COD',137459), +(2311,'Boma','COD',135284), +(2312,'Uvira','COD',115590), +(2313,'Butembo','COD',109406), +(2314,'Goma','COD',109094), +(2315,'Kalemie','COD',101309), +(2316,'Bantam','CCK',503), +(2317,'West Island','CCK',167), +(2318,'Pyongyang','PRK',2484000), +(2319,'Hamhung','PRK',709730), +(2320,'Chongjin','PRK',582480), +(2321,'Nampo','PRK',566200), +(2322,'Sinuiju','PRK',326011), +(2323,'Wonsan','PRK',300148), +(2324,'Phyongsong','PRK',272934), +(2325,'Sariwon','PRK',254146), +(2326,'Haeju','PRK',229172), +(2327,'Kanggye','PRK',223410), +(2328,'Kimchaek','PRK',179000), +(2329,'Hyesan','PRK',178020), +(2330,'Kaesong','PRK',171500), +(2331,'Seoul','KOR',9981619), +(2332,'Pusan','KOR',3804522), +(2333,'Inchon','KOR',2559424), +(2334,'Taegu','KOR',2548568), +(2335,'Taejon','KOR',1425835), +(2336,'Kwangju','KOR',1368341), +(2337,'Ulsan','KOR',1084891), +(2338,'Songnam','KOR',869094), +(2339,'Puchon','KOR',779412), +(2340,'Suwon','KOR',755550), +(2341,'Anyang','KOR',591106), +(2342,'Chonju','KOR',563153), +(2343,'Chongju','KOR',531376), +(2344,'Koyang','KOR',518282), +(2345,'Ansan','KOR',510314), +(2346,'Pohang','KOR',508899), +(2347,'Chang-won','KOR',481694), +(2348,'Masan','KOR',441242), +(2349,'Kwangmyong','KOR',350914), +(2350,'Chonan','KOR',330259), +(2351,'Chinju','KOR',329886), +(2352,'Iksan','KOR',322685), +(2353,'Pyongtaek','KOR',312927), +(2354,'Kumi','KOR',311431), +(2355,'Uijongbu','KOR',276111), +(2356,'Kyongju','KOR',272968), +(2357,'Kunsan','KOR',266569), +(2358,'Cheju','KOR',258511), +(2359,'Kimhae','KOR',256370), +(2360,'Sunchon','KOR',249263), +(2361,'Mokpo','KOR',247452), +(2362,'Yong-in','KOR',242643), +(2363,'Wonju','KOR',237460), +(2364,'Kunpo','KOR',235233), +(2365,'Chunchon','KOR',234528), +(2366,'Namyangju','KOR',229060), +(2367,'Kangnung','KOR',220403), +(2368,'Chungju','KOR',205206), +(2369,'Andong','KOR',188443), +(2370,'Yosu','KOR',183596), +(2371,'Kyongsan','KOR',173746), +(2372,'Paju','KOR',163379), +(2373,'Yangsan','KOR',163351), +(2374,'Ichon','KOR',155332), +(2375,'Asan','KOR',154663), +(2376,'Koje','KOR',147562), +(2377,'Kimchon','KOR',147027), +(2378,'Nonsan','KOR',146619), +(2379,'Kuri','KOR',142173), +(2380,'Chong-up','KOR',139111), +(2381,'Chechon','KOR',137070), +(2382,'Sosan','KOR',134746), +(2383,'Shihung','KOR',133443), +(2384,'Tong-yong','KOR',131717), +(2385,'Kongju','KOR',131229), +(2386,'Yongju','KOR',131097), +(2387,'Chinhae','KOR',125997), +(2388,'Sangju','KOR',124116), +(2389,'Poryong','KOR',122604), +(2390,'Kwang-yang','KOR',122052), +(2391,'Miryang','KOR',121501), +(2392,'Hanam','KOR',115812), +(2393,'Kimje','KOR',115427), +(2394,'Yongchon','KOR',113511), +(2395,'Sachon','KOR',113494), +(2396,'Uiwang','KOR',108788), +(2397,'Naju','KOR',107831), +(2398,'Namwon','KOR',103544), +(2399,'Tonghae','KOR',95472), +(2400,'Mun-gyong','KOR',92239); +INSERT INTO City VALUES +(2401,'Athenai','GRC',772072), +(2402,'Thessaloniki','GRC',383967), +(2403,'Pireus','GRC',182671), +(2404,'Patras','GRC',153344), +(2405,'Peristerion','GRC',137288), +(2406,'Herakleion','GRC',116178), +(2407,'Kallithea','GRC',114233), +(2408,'Larisa','GRC',113090), +(2409,'Zagreb','HRV',706770), +(2410,'Split','HRV',189388), +(2411,'Rijeka','HRV',167964), +(2412,'Osijek','HRV',104761), +(2413,'La Habana','CUB',2256000), +(2414,'Santiago de Cuba','CUB',433180), +(2415,'Camagüey','CUB',298726), +(2416,'Holguín','CUB',249492), +(2417,'Santa Clara','CUB',207350), +(2418,'Guantánamo','CUB',205078), +(2419,'Pinar del Río','CUB',142100), +(2420,'Bayamo','CUB',141000), +(2421,'Cienfuegos','CUB',132770), +(2422,'Victoria de las Tunas','CUB',132350), +(2423,'Matanzas','CUB',123273), +(2424,'Manzanillo','CUB',109350), +(2425,'Sancti-Spíritus','CUB',100751), +(2426,'Ciego de Ávila','CUB',98505), +(2427,'al-Salimiya','KWT',130215), +(2428,'Jalib al-Shuyukh','KWT',102178), +(2429,'Kuwait','KWT',28859), +(2430,'Nicosia','CYP',195000), +(2431,'Limassol','CYP',154400), +(2432,'Vientiane','LAO',531800), +(2433,'Savannakhet','LAO',96652), +(2434,'Riga','LVA',764328), +(2435,'Daugavpils','LVA',114829), +(2436,'Liepaja','LVA',89439), +(2437,'Maseru','LSO',297000), +(2438,'Beirut','LBN',1100000), +(2439,'Tripoli','LBN',240000), +(2440,'Monrovia','LBR',850000), +(2441,'Tripoli','LBY',1682000), +(2442,'Bengasi','LBY',804000), +(2443,'Misrata','LBY',121669), +(2444,'al-Zawiya','LBY',89338), +(2445,'Schaan','LIE',5346), +(2446,'Vaduz','LIE',5043), +(2447,'Vilnius','LTU',577969), +(2448,'Kaunas','LTU',412639), +(2449,'Klaipeda','LTU',202451), +(2450,'iauliai','LTU',146563), +(2451,'Panevezys','LTU',133695), +(2452,'Luxembourg [Luxemburg/Lëtzebuerg]','LUX',80700), +(2453,'El-Aaiún','ESH',169000), +(2454,'Macao','MAC',437500), +(2455,'Antananarivo','MDG',675669), +(2456,'Toamasina','MDG',127441), +(2457,'Antsirabé','MDG',120239), +(2458,'Mahajanga','MDG',100807), +(2459,'Fianarantsoa','MDG',99005), +(2460,'Skopje','MKD',444299), +(2461,'Blantyre','MWI',478155), +(2462,'Lilongwe','MWI',435964), +(2463,'Male','MDV',71000), +(2464,'Kuala Lumpur','MYS',1297526), +(2465,'Ipoh','MYS',382853), +(2466,'Johor Baharu','MYS',328436), +(2467,'Petaling Jaya','MYS',254350), +(2468,'Kelang','MYS',243355), +(2469,'Kuala Terengganu','MYS',228119), +(2470,'Pinang','MYS',219603), +(2471,'Kota Bharu','MYS',219582), +(2472,'Kuantan','MYS',199484), +(2473,'Taiping','MYS',183261), +(2474,'Seremban','MYS',182869), +(2475,'Kuching','MYS',148059), +(2476,'Sibu','MYS',126381), +(2477,'Sandakan','MYS',125841), +(2478,'Alor Setar','MYS',124412), +(2479,'Selayang Baru','MYS',124228), +(2480,'Sungai Petani','MYS',114763), +(2481,'Shah Alam','MYS',102019), +(2482,'Bamako','MLI',809552), +(2483,'Birkirkara','MLT',21445), +(2484,'Valletta','MLT',7073), +(2485,'Casablanca','MAR',2940623), +(2486,'Rabat','MAR',623457), +(2487,'Marrakech','MAR',621914), +(2488,'Fès','MAR',541162), +(2489,'Tanger','MAR',521735), +(2490,'Salé','MAR',504420), +(2491,'Meknès','MAR',460000), +(2492,'Oujda','MAR',365382), +(2493,'Kénitra','MAR',292600), +(2494,'Tétouan','MAR',277516), +(2495,'Safi','MAR',262300), +(2496,'Agadir','MAR',155244), +(2497,'Mohammedia','MAR',154706), +(2498,'Khouribga','MAR',152090), +(2499,'Beni-Mellal','MAR',140212), +(2500,'Témara','MAR',126303), +(2501,'El Jadida','MAR',119083), +(2502,'Nador','MAR',112450), +(2503,'Ksar el Kebir','MAR',107065), +(2504,'Settat','MAR',96200), +(2505,'Taza','MAR',92700), +(2506,'El Araich','MAR',90400), +(2507,'Dalap-Uliga-Darrit','MHL',28000), +(2508,'Fort-de-France','MTQ',94050), +(2509,'Nouakchott','MRT',667300), +(2510,'Nouâdhibou','MRT',97600), +(2511,'Port-Louis','MUS',138200), +(2512,'Beau Bassin-Rose Hill','MUS',100616), +(2513,'Vacoas-Phoenix','MUS',98464), +(2514,'Mamoutzou','MYT',12000), +(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), +(2531,'Chihuahua','MEX',670208), +(2532,'San Luis Potosí','MEX',669353), +(2533,'Guadalupe','MEX',668780), +(2534,'Toluca','MEX',665617), +(2535,'Aguascalientes','MEX',643360), +(2536,'Querétaro','MEX',639839), +(2537,'Morelia','MEX',619958), +(2538,'Hermosillo','MEX',608697), +(2539,'Saltillo','MEX',577352), +(2540,'Torreón','MEX',529093), +(2541,'Centro (Villahermosa)','MEX',519873), +(2542,'San Nicolás de los Garza','MEX',495540), +(2543,'Durango','MEX',490524), +(2544,'Chimalhuacán','MEX',490245), +(2545,'Tlaquepaque','MEX',475472), +(2546,'Atizapán de Zaragoza','MEX',467262), +(2547,'Veracruz','MEX',457119), +(2548,'Cuautitlán Izcalli','MEX',452976), +(2549,'Irapuato','MEX',440039), +(2550,'Tuxtla Gutiérrez','MEX',433544), +(2551,'Tultitlán','MEX',432411), +(2552,'Reynosa','MEX',419776), +(2553,'Benito Juárez','MEX',419276), +(2554,'Matamoros','MEX',416428), +(2555,'Xalapa','MEX',390058), +(2556,'Celaya','MEX',382140), +(2557,'Mazatlán','MEX',380265), +(2558,'Ensenada','MEX',369573), +(2559,'Ahome','MEX',358663), +(2560,'Cajeme','MEX',355679), +(2561,'Cuernavaca','MEX',337966), +(2562,'Tonalá','MEX',336109), +(2563,'Valle de Chalco Solidaridad','MEX',323113), +(2564,'Nuevo Laredo','MEX',310277), +(2565,'Tepic','MEX',305025), +(2566,'Tampico','MEX',294789), +(2567,'Ixtapaluca','MEX',293160), +(2568,'Apodaca','MEX',282941), +(2569,'Guasave','MEX',277201), +(2570,'Gómez Palacio','MEX',272806), +(2571,'Tapachula','MEX',271141), +(2572,'Nicolás Romero','MEX',269393), +(2573,'Coatzacoalcos','MEX',267037), +(2574,'Uruapan','MEX',265211), +(2575,'Victoria','MEX',262686), +(2576,'Oaxaca de Juárez','MEX',256848), +(2577,'Coacalco de Berriozábal','MEX',252270), +(2578,'Pachuca de Soto','MEX',244688), +(2579,'General Escobedo','MEX',232961), +(2580,'Salamanca','MEX',226864), +(2581,'Santa Catarina','MEX',226573), +(2582,'Tehuacán','MEX',225943), +(2583,'Chalco','MEX',222201), +(2584,'Cárdenas','MEX',216903), +(2585,'Campeche','MEX',216735), +(2586,'La Paz','MEX',213045), +(2587,'Othón P. Blanco (Chetumal)','MEX',208014), +(2588,'Texcoco','MEX',203681), +(2589,'La Paz','MEX',196708), +(2590,'Metepec','MEX',194265), +(2591,'Monclova','MEX',193657), +(2592,'Huixquilucan','MEX',193156), +(2593,'Chilpancingo de los Bravo','MEX',192509), +(2594,'Puerto Vallarta','MEX',183741), +(2595,'Fresnillo','MEX',182744), +(2596,'Ciudad Madero','MEX',182012), +(2597,'Soledad de Graciano Sánchez','MEX',179956), +(2598,'San Juan del Río','MEX',179300), +(2599,'San Felipe del Progreso','MEX',177330), +(2600,'Córdoba','MEX',176952); +INSERT INTO City VALUES +(2601,'Tecámac','MEX',172410), +(2602,'Ocosingo','MEX',171495), +(2603,'Carmen','MEX',171367), +(2604,'Lázaro Cárdenas','MEX',170878), +(2605,'Jiutepec','MEX',170428), +(2606,'Papantla','MEX',170123), +(2607,'Comalcalco','MEX',164640), +(2608,'Zamora','MEX',161191), +(2609,'Nogales','MEX',159103), +(2610,'Huimanguillo','MEX',158335), +(2611,'Cuautla','MEX',153132), +(2612,'Minatitlán','MEX',152983), +(2613,'Poza Rica de Hidalgo','MEX',152678), +(2614,'Ciudad Valles','MEX',146411), +(2615,'Navolato','MEX',145396), +(2616,'San Luis Río Colorado','MEX',145276), +(2617,'Pénjamo','MEX',143927), +(2618,'San Andrés Tuxtla','MEX',142251), +(2619,'Guanajuato','MEX',141215), +(2620,'Navojoa','MEX',140495), +(2621,'Zitácuaro','MEX',137970), +(2622,'Boca del Río','MEX',135721), +(2623,'Allende','MEX',134645), +(2624,'Silao','MEX',134037), +(2625,'Macuspana','MEX',133795), +(2626,'San Juan Bautista Tuxtepec','MEX',133675), +(2627,'San Cristóbal de las Casas','MEX',132317), +(2628,'Valle de Santiago','MEX',130557), +(2629,'Guaymas','MEX',130108), +(2630,'Colima','MEX',129454), +(2631,'Dolores Hidalgo','MEX',128675), +(2632,'Lagos de Moreno','MEX',127949), +(2633,'Piedras Negras','MEX',127898), +(2634,'Altamira','MEX',127490), +(2635,'Túxpam','MEX',126475), +(2636,'San Pedro Garza García','MEX',126147), +(2637,'Cuauhtémoc','MEX',124279), +(2638,'Manzanillo','MEX',124014), +(2639,'Iguala de la Independencia','MEX',123883), +(2640,'Zacatecas','MEX',123700), +(2641,'Tlajomulco de Zúñiga','MEX',123220), +(2642,'Tulancingo de Bravo','MEX',121946), +(2643,'Zinacantepec','MEX',121715), +(2644,'San Martín Texmelucan','MEX',121093), +(2645,'Tepatitlán de Morelos','MEX',118948), +(2646,'Martínez de la Torre','MEX',118815), +(2647,'Orizaba','MEX',118488), +(2648,'Apatzingán','MEX',117849), +(2649,'Atlixco','MEX',117019), +(2650,'Delicias','MEX',116132), +(2651,'Ixtlahuaca','MEX',115548), +(2652,'El Mante','MEX',112453), +(2653,'Lerdo','MEX',112272), +(2654,'Almoloya de Juárez','MEX',110550), +(2655,'Acámbaro','MEX',110487), +(2656,'Acuña','MEX',110388), +(2657,'Guadalupe','MEX',108881), +(2658,'Huejutla de Reyes','MEX',108017), +(2659,'Hidalgo','MEX',106198), +(2660,'Los Cabos','MEX',105199), +(2661,'Comitán de Domínguez','MEX',104986), +(2662,'Cunduacán','MEX',104164), +(2663,'Río Bravo','MEX',103901), +(2664,'Temapache','MEX',102824), +(2665,'Chilapa de Alvarez','MEX',102716), +(2666,'Hidalgo del Parral','MEX',100881), +(2667,'San Francisco del Rincón','MEX',100149), +(2668,'Taxco de Alarcón','MEX',99907), +(2669,'Zumpango','MEX',99781), +(2670,'San Pedro Cholula','MEX',99734), +(2671,'Lerma','MEX',99714), +(2672,'Tecomán','MEX',99296), +(2673,'Las Margaritas','MEX',97389), +(2674,'Cosoleacaque','MEX',97199), +(2675,'San Luis de la Paz','MEX',96763), +(2676,'José Azueta','MEX',95448), +(2677,'Santiago Ixcuintla','MEX',95311), +(2678,'San Felipe','MEX',95305), +(2679,'Tejupilco','MEX',94934), +(2680,'Tantoyuca','MEX',94709), +(2681,'Salvatierra','MEX',94322), +(2682,'Tultepec','MEX',93364), +(2683,'Temixco','MEX',92686), +(2684,'Matamoros','MEX',91858), +(2685,'Pánuco','MEX',90551), +(2686,'El Fuerte','MEX',89556), +(2687,'Tierra Blanca','MEX',89143), +(2688,'Weno','FSM',22000), +(2689,'Palikir','FSM',8600), +(2690,'Chisinau','MDA',719900), +(2691,'Tiraspol','MDA',194300), +(2692,'Balti','MDA',153400), +(2693,'Bender (Tîghina)','MDA',125700), +(2694,'Monte-Carlo','MCO',13154), +(2695,'Monaco-Ville','MCO',1234), +(2696,'Ulan Bator','MNG',773700), +(2697,'Plymouth','MSR',2000), +(2698,'Maputo','MOZ',1018938), +(2699,'Matola','MOZ',424662), +(2700,'Beira','MOZ',397368), +(2701,'Nampula','MOZ',303346), +(2702,'Chimoio','MOZ',171056), +(2703,'Naçala-Porto','MOZ',158248), +(2704,'Quelimane','MOZ',150116), +(2705,'Mocuba','MOZ',124700), +(2706,'Tete','MOZ',101984), +(2707,'Xai-Xai','MOZ',99442), +(2708,'Gurue','MOZ',99300), +(2709,'Maxixe','MOZ',93985), +(2710,'Rangoon (Yangon)','MMR',3361700), +(2711,'Mandalay','MMR',885300), +(2712,'Moulmein (Mawlamyine)','MMR',307900), +(2713,'Pegu (Bago)','MMR',190900), +(2714,'Bassein (Pathein)','MMR',183900), +(2715,'Monywa','MMR',138600), +(2716,'Sittwe (Akyab)','MMR',137600), +(2717,'Taunggyi (Taunggye)','MMR',131500), +(2718,'Meikhtila','MMR',129700), +(2719,'Mergui (Myeik)','MMR',122700), +(2720,'Lashio (Lasho)','MMR',107600), +(2721,'Prome (Pyay)','MMR',105700), +(2722,'Henzada (Hinthada)','MMR',104700), +(2723,'Myingyan','MMR',103600), +(2724,'Tavoy (Dawei)','MMR',96800), +(2725,'Pagakku (Pakokku)','MMR',94800), +(2726,'Windhoek','NAM',169000), +(2727,'Yangor','NRU',4050), +(2728,'Yaren','NRU',559), +(2729,'Kathmandu','NPL',591835), +(2730,'Biratnagar','NPL',157764), +(2731,'Pokhara','NPL',146318), +(2732,'Lalitapur','NPL',145847), +(2733,'Birgunj','NPL',90639), +(2734,'Managua','NIC',959000), +(2735,'León','NIC',123865), +(2736,'Chinandega','NIC',97387), +(2737,'Masaya','NIC',88971), +(2738,'Niamey','NER',420000), +(2739,'Zinder','NER',120892), +(2740,'Maradi','NER',112965), +(2741,'Lagos','NGA',1518000), +(2742,'Ibadan','NGA',1432000), +(2743,'Ogbomosho','NGA',730000), +(2744,'Kano','NGA',674100), +(2745,'Oshogbo','NGA',476800), +(2746,'Ilorin','NGA',475800), +(2747,'Abeokuta','NGA',427400), +(2748,'Port Harcourt','NGA',410000), +(2749,'Zaria','NGA',379200), +(2750,'Ilesha','NGA',378400), +(2751,'Onitsha','NGA',371900), +(2752,'Iwo','NGA',362000), +(2753,'Ado-Ekiti','NGA',359400), +(2754,'Abuja','NGA',350100), +(2755,'Kaduna','NGA',342200), +(2756,'Mushin','NGA',333200), +(2757,'Maiduguri','NGA',320000), +(2758,'Enugu','NGA',316100), +(2759,'Ede','NGA',307100), +(2760,'Aba','NGA',298900), +(2761,'Ife','NGA',296800), +(2762,'Ila','NGA',264000), +(2763,'Oyo','NGA',256400), +(2764,'Ikerre','NGA',244600), +(2765,'Benin City','NGA',229400), +(2766,'Iseyin','NGA',217300), +(2767,'Katsina','NGA',206500), +(2768,'Jos','NGA',206300), +(2769,'Sokoto','NGA',204900), +(2770,'Ilobu','NGA',199000), +(2771,'Offa','NGA',197200), +(2772,'Ikorodu','NGA',184900), +(2773,'Ilawe-Ekiti','NGA',184500), +(2774,'Owo','NGA',183500), +(2775,'Ikirun','NGA',181400), +(2776,'Shaki','NGA',174500), +(2777,'Calabar','NGA',174400), +(2778,'Ondo','NGA',173600), +(2779,'Akure','NGA',162300), +(2780,'Gusau','NGA',158000), +(2781,'Ijebu-Ode','NGA',156400), +(2782,'Effon-Alaiye','NGA',153100), +(2783,'Kumo','NGA',148000), +(2784,'Shomolu','NGA',147700), +(2785,'Oka-Akoko','NGA',142900), +(2786,'Ikare','NGA',140800), +(2787,'Sapele','NGA',139200), +(2788,'Deba Habe','NGA',138600), +(2789,'Minna','NGA',136900), +(2790,'Warri','NGA',126100), +(2791,'Bida','NGA',125500), +(2792,'Ikire','NGA',123300), +(2793,'Makurdi','NGA',123100), +(2794,'Lafia','NGA',122500), +(2795,'Inisa','NGA',119800), +(2796,'Shagamu','NGA',117200), +(2797,'Awka','NGA',111200), +(2798,'Gombe','NGA',107800), +(2799,'Igboho','NGA',106800), +(2800,'Ejigbo','NGA',105900); +INSERT INTO City VALUES +(2801,'Agege','NGA',105000), +(2802,'Ise-Ekiti','NGA',103400), +(2803,'Ugep','NGA',102600), +(2804,'Epe','NGA',101000), +(2805,'Alofi','NIU',682), +(2806,'Kingston','NFK',800), +(2807,'Oslo','NOR',508726), +(2808,'Bergen','NOR',230948), +(2809,'Trondheim','NOR',150166), +(2810,'Stavanger','NOR',108848), +(2811,'Bærum','NOR',101340), +(2812,'Abidjan','CIV',2500000), +(2813,'Bouaké','CIV',329850), +(2814,'Yamoussoukro','CIV',130000), +(2815,'Daloa','CIV',121842), +(2816,'Korhogo','CIV',109445), +(2817,'al-Sib','OMN',155000), +(2818,'Salala','OMN',131813), +(2819,'Bawshar','OMN',107500), +(2820,'Suhar','OMN',90814), +(2821,'Masqat','OMN',51969), +(2822,'Karachi','PAK',9269265), +(2823,'Lahore','PAK',5063499), +(2824,'Faisalabad','PAK',1977246), +(2825,'Rawalpindi','PAK',1406214), +(2826,'Multan','PAK',1182441), +(2827,'Hyderabad','PAK',1151274), +(2828,'Gujranwala','PAK',1124749), +(2829,'Peshawar','PAK',988005), +(2830,'Quetta','PAK',560307), +(2831,'Islamabad','PAK',524500), +(2832,'Sargodha','PAK',455360), +(2833,'Sialkot','PAK',417597), +(2834,'Bahawalpur','PAK',403408), +(2835,'Sukkur','PAK',329176), +(2836,'Jhang','PAK',292214), +(2837,'Sheikhupura','PAK',271875), +(2838,'Larkana','PAK',270366), +(2839,'Gujrat','PAK',250121), +(2840,'Mardan','PAK',244511), +(2841,'Kasur','PAK',241649), +(2842,'Rahim Yar Khan','PAK',228479), +(2843,'Sahiwal','PAK',207388), +(2844,'Okara','PAK',200901), +(2845,'Wah','PAK',198400), +(2846,'Dera Ghazi Khan','PAK',188100), +(2847,'Mirpur Khas','PAK',184500), +(2848,'Nawabshah','PAK',183100), +(2849,'Mingora','PAK',174500), +(2850,'Chiniot','PAK',169300), +(2851,'Kamoke','PAK',151000), +(2852,'Mandi Burewala','PAK',149900), +(2853,'Jhelum','PAK',145800), +(2854,'Sadiqabad','PAK',141500), +(2855,'Jacobabad','PAK',137700), +(2856,'Shikarpur','PAK',133300), +(2857,'Khanewal','PAK',133000), +(2858,'Hafizabad','PAK',130200), +(2859,'Kohat','PAK',125300), +(2860,'Muzaffargarh','PAK',121600), +(2861,'Khanpur','PAK',117800), +(2862,'Gojra','PAK',115000), +(2863,'Bahawalnagar','PAK',109600), +(2864,'Muridke','PAK',108600), +(2865,'Pak Pattan','PAK',107800), +(2866,'Abottabad','PAK',106000), +(2867,'Tando Adam','PAK',103400), +(2868,'Jaranwala','PAK',103300), +(2869,'Khairpur','PAK',102200), +(2870,'Chishtian Mandi','PAK',101700), +(2871,'Daska','PAK',101500), +(2872,'Dadu','PAK',98600), +(2873,'Mandi Bahauddin','PAK',97300), +(2874,'Ahmadpur East','PAK',96000), +(2875,'Kamalia','PAK',95300), +(2876,'Khuzdar','PAK',93100), +(2877,'Vihari','PAK',92300), +(2878,'Dera Ismail Khan','PAK',90400), +(2879,'Wazirabad','PAK',89700), +(2880,'Nowshera','PAK',89400), +(2881,'Koror','PLW',12000), +(2882,'Ciudad de Panamá','PAN',471373), +(2883,'San Miguelito','PAN',315382), +(2884,'Port Moresby','PNG',247000), +(2885,'Asunción','PRY',557776), +(2886,'Ciudad del Este','PRY',133881), +(2887,'San Lorenzo','PRY',133395), +(2888,'Lambaré','PRY',99681), +(2889,'Fernando de la Mora','PRY',95287), +(2890,'Lima','PER',6464693), +(2891,'Arequipa','PER',762000), +(2892,'Trujillo','PER',652000), +(2893,'Chiclayo','PER',517000), +(2894,'Callao','PER',424294), +(2895,'Iquitos','PER',367000), +(2896,'Chimbote','PER',336000), +(2897,'Huancayo','PER',327000), +(2898,'Piura','PER',325000), +(2899,'Cusco','PER',291000), +(2900,'Pucallpa','PER',220866), +(2901,'Tacna','PER',215683), +(2902,'Ica','PER',194820), +(2903,'Sullana','PER',147361), +(2904,'Juliaca','PER',142576), +(2905,'Huánuco','PER',129688), +(2906,'Ayacucho','PER',118960), +(2907,'Chincha Alta','PER',110016), +(2908,'Cajamarca','PER',108009), +(2909,'Puno','PER',101578), +(2910,'Ventanilla','PER',101056), +(2911,'Castilla','PER',90642), +(2912,'Adamstown','PCN',42), +(2913,'Garapan','MNP',9200), +(2914,'Lisboa','PRT',563210), +(2915,'Porto','PRT',273060), +(2916,'Amadora','PRT',122106), +(2917,'Coímbra','PRT',96100), +(2918,'Braga','PRT',90535), +(2919,'San Juan','PRI',434374), +(2920,'Bayamón','PRI',224044), +(2921,'Ponce','PRI',186475), +(2922,'Carolina','PRI',186076), +(2923,'Caguas','PRI',140502), +(2924,'Arecibo','PRI',100131), +(2925,'Guaynabo','PRI',100053), +(2926,'Mayagüez','PRI',98434), +(2927,'Toa Baja','PRI',94085), +(2928,'Warszawa','POL',1615369), +(2929,'Lódz','POL',800110), +(2930,'Kraków','POL',738150), +(2931,'Wroclaw','POL',636765), +(2932,'Poznan','POL',576899), +(2933,'Gdansk','POL',458988), +(2934,'Szczecin','POL',416988), +(2935,'Bydgoszcz','POL',386855), +(2936,'Lublin','POL',356251), +(2937,'Katowice','POL',345934), +(2938,'Bialystok','POL',283937), +(2939,'Czestochowa','POL',257812), +(2940,'Gdynia','POL',253521), +(2941,'Sosnowiec','POL',244102), +(2942,'Radom','POL',232262), +(2943,'Kielce','POL',212383), +(2944,'Gliwice','POL',212164), +(2945,'Torun','POL',206158), +(2946,'Bytom','POL',205560), +(2947,'Zabrze','POL',200177), +(2948,'Bielsko-Biala','POL',180307), +(2949,'Olsztyn','POL',170904), +(2950,'Rzeszów','POL',162049), +(2951,'Ruda Slaska','POL',159665), +(2952,'Rybnik','POL',144582), +(2953,'Walbrzych','POL',136923), +(2954,'Tychy','POL',133178), +(2955,'Dabrowa Górnicza','POL',131037), +(2956,'Plock','POL',131011), +(2957,'Elblag','POL',129782), +(2958,'Opole','POL',129553), +(2959,'Gorzów Wielkopolski','POL',126019), +(2960,'Wloclawek','POL',123373), +(2961,'Chorzów','POL',121708), +(2962,'Tarnów','POL',121494), +(2963,'Zielona Góra','POL',118182), +(2964,'Koszalin','POL',112375), +(2965,'Legnica','POL',109335), +(2966,'Kalisz','POL',106641), +(2967,'Grudziadz','POL',102434), +(2968,'Slupsk','POL',102370), +(2969,'Jastrzebie-Zdrój','POL',102294), +(2970,'Jaworzno','POL',97929), +(2971,'Jelenia Góra','POL',93901), +(2972,'Malabo','GNQ',40000), +(2973,'Doha','QAT',355000), +(2974,'Paris','FRA',2125246), +(2975,'Marseille','FRA',798430), +(2976,'Lyon','FRA',445452), +(2977,'Toulouse','FRA',390350), +(2978,'Nice','FRA',342738), +(2979,'Nantes','FRA',270251), +(2980,'Strasbourg','FRA',264115), +(2981,'Montpellier','FRA',225392), +(2982,'Bordeaux','FRA',215363), +(2983,'Rennes','FRA',206229), +(2984,'Le Havre','FRA',190905), +(2985,'Reims','FRA',187206), +(2986,'Lille','FRA',184657), +(2987,'St-Étienne','FRA',180210), +(2988,'Toulon','FRA',160639), +(2989,'Grenoble','FRA',153317), +(2990,'Angers','FRA',151279), +(2991,'Dijon','FRA',149867), +(2992,'Brest','FRA',149634), +(2993,'Le Mans','FRA',146105), +(2994,'Clermont-Ferrand','FRA',137140), +(2995,'Amiens','FRA',135501), +(2996,'Aix-en-Provence','FRA',134222), +(2997,'Limoges','FRA',133968), +(2998,'Nîmes','FRA',133424), +(2999,'Tours','FRA',132820), +(3000,'Villeurbanne','FRA',124215); +INSERT INTO City VALUES +(3001,'Metz','FRA',123776), +(3002,'Besançon','FRA',117733), +(3003,'Caen','FRA',113987), +(3004,'Orléans','FRA',113126), +(3005,'Mulhouse','FRA',110359), +(3006,'Rouen','FRA',106592), +(3007,'Boulogne-Billancourt','FRA',106367), +(3008,'Perpignan','FRA',105115), +(3009,'Nancy','FRA',103605), +(3010,'Roubaix','FRA',96984), +(3011,'Argenteuil','FRA',93961), +(3012,'Tourcoing','FRA',93540), +(3013,'Montreuil','FRA',90674), +(3014,'Cayenne','GUF',50699), +(3015,'Faaa','PYF',25888), +(3016,'Papeete','PYF',25553), +(3017,'Saint-Denis','REU',131480), +(3018,'Bucuresti','ROM',2016131), +(3019,'Iasi','ROM',348070), +(3020,'Constanta','ROM',342264), +(3021,'Cluj-Napoca','ROM',332498), +(3022,'Galati','ROM',330276), +(3023,'Timisoara','ROM',324304), +(3024,'Brasov','ROM',314225), +(3025,'Craiova','ROM',313530), +(3026,'Ploiesti','ROM',251348), +(3027,'Braila','ROM',233756), +(3028,'Oradea','ROM',222239), +(3029,'Bacau','ROM',209235), +(3030,'Pitesti','ROM',187170), +(3031,'Arad','ROM',184408), +(3032,'Sibiu','ROM',169611), +(3033,'Târgu Mures','ROM',165153), +(3034,'Baia Mare','ROM',149665), +(3035,'Buzau','ROM',148372), +(3036,'Satu Mare','ROM',130059), +(3037,'Botosani','ROM',128730), +(3038,'Piatra Neamt','ROM',125070), +(3039,'Râmnicu Vâlcea','ROM',119741), +(3040,'Suceava','ROM',118549), +(3041,'Drobeta-Turnu Severin','ROM',117865), +(3042,'Târgoviste','ROM',98980), +(3043,'Focsani','ROM',98979), +(3044,'Târgu Jiu','ROM',98524), +(3045,'Tulcea','ROM',96278), +(3046,'Resita','ROM',93976), +(3047,'Kigali','RWA',286000), +(3048,'Stockholm','SWE',750348), +(3049,'Gothenburg [Göteborg]','SWE',466990), +(3050,'Malmö','SWE',259579), +(3051,'Uppsala','SWE',189569), +(3052,'Linköping','SWE',133168), +(3053,'Västerås','SWE',126328), +(3054,'Örebro','SWE',124207), +(3055,'Norrköping','SWE',122199), +(3056,'Helsingborg','SWE',117737), +(3057,'Jönköping','SWE',117095), +(3058,'Umeå','SWE',104512), +(3059,'Lund','SWE',98948), +(3060,'Borås','SWE',96883), +(3061,'Sundsvall','SWE',93126), +(3062,'Gävle','SWE',90742), +(3063,'Jamestown','SHN',1500), +(3064,'Basseterre','KNA',11600), +(3065,'Castries','LCA',2301), +(3066,'Kingstown','VCT',17100), +(3067,'Saint-Pierre','SPM',5808), +(3068,'Berlin','DEU',3386667), +(3069,'Hamburg','DEU',1704735), +(3070,'Munich [München]','DEU',1194560), +(3071,'Köln','DEU',962507), +(3072,'Frankfurt am Main','DEU',643821), +(3073,'Essen','DEU',599515), +(3074,'Dortmund','DEU',590213), +(3075,'Stuttgart','DEU',582443), +(3076,'Düsseldorf','DEU',568855), +(3077,'Bremen','DEU',540330), +(3078,'Duisburg','DEU',519793), +(3079,'Hannover','DEU',514718), +(3080,'Leipzig','DEU',489532), +(3081,'Nürnberg','DEU',486628), +(3082,'Dresden','DEU',476668), +(3083,'Bochum','DEU',392830), +(3084,'Wuppertal','DEU',368993), +(3085,'Bielefeld','DEU',321125), +(3086,'Mannheim','DEU',307730), +(3087,'Bonn','DEU',301048), +(3088,'Gelsenkirchen','DEU',281979), +(3089,'Karlsruhe','DEU',277204), +(3090,'Wiesbaden','DEU',268716), +(3091,'Münster','DEU',264670), +(3092,'Mönchengladbach','DEU',263697), +(3093,'Chemnitz','DEU',263222), +(3094,'Augsburg','DEU',254867), +(3095,'Halle/Saale','DEU',254360), +(3096,'Braunschweig','DEU',246322), +(3097,'Aachen','DEU',243825), +(3098,'Krefeld','DEU',241769), +(3099,'Magdeburg','DEU',235073), +(3100,'Kiel','DEU',233795), +(3101,'Oberhausen','DEU',222349), +(3102,'Lübeck','DEU',213326), +(3103,'Hagen','DEU',205201), +(3104,'Rostock','DEU',203279), +(3105,'Freiburg im Breisgau','DEU',202455), +(3106,'Erfurt','DEU',201267), +(3107,'Kassel','DEU',196211), +(3108,'Saarbrücken','DEU',183836), +(3109,'Mainz','DEU',183134), +(3110,'Hamm','DEU',181804), +(3111,'Herne','DEU',175661), +(3112,'Mülheim an der Ruhr','DEU',173895), +(3113,'Solingen','DEU',165583), +(3114,'Osnabrück','DEU',164539), +(3115,'Ludwigshafen am Rhein','DEU',163771), +(3116,'Leverkusen','DEU',160841), +(3117,'Oldenburg','DEU',154125), +(3118,'Neuss','DEU',149702), +(3119,'Heidelberg','DEU',139672), +(3120,'Darmstadt','DEU',137776), +(3121,'Paderborn','DEU',137647), +(3122,'Potsdam','DEU',128983), +(3123,'Würzburg','DEU',127350), +(3124,'Regensburg','DEU',125236), +(3125,'Recklinghausen','DEU',125022), +(3126,'Göttingen','DEU',124775), +(3127,'Bremerhaven','DEU',122735), +(3128,'Wolfsburg','DEU',121954), +(3129,'Bottrop','DEU',121097), +(3130,'Remscheid','DEU',120125), +(3131,'Heilbronn','DEU',119526), +(3132,'Pforzheim','DEU',117227), +(3133,'Offenbach am Main','DEU',116627), +(3134,'Ulm','DEU',116103), +(3135,'Ingolstadt','DEU',114826), +(3136,'Gera','DEU',114718), +(3137,'Salzgitter','DEU',112934), +(3138,'Cottbus','DEU',110894), +(3139,'Reutlingen','DEU',110343), +(3140,'Fürth','DEU',109771), +(3141,'Siegen','DEU',109225), +(3142,'Koblenz','DEU',108003), +(3143,'Moers','DEU',106837), +(3144,'Bergisch Gladbach','DEU',106150), +(3145,'Zwickau','DEU',104146), +(3146,'Hildesheim','DEU',104013), +(3147,'Witten','DEU',103384), +(3148,'Schwerin','DEU',102878), +(3149,'Erlangen','DEU',100750), +(3150,'Kaiserslautern','DEU',100025), +(3151,'Trier','DEU',99891), +(3152,'Jena','DEU',99779), +(3153,'Iserlohn','DEU',99474), +(3154,'Gütersloh','DEU',95028), +(3155,'Marl','DEU',93735), +(3156,'Lünen','DEU',92044), +(3157,'Düren','DEU',91092), +(3158,'Ratingen','DEU',90951), +(3159,'Velbert','DEU',89881), +(3160,'Esslingen am Neckar','DEU',89667), +(3161,'Honiara','SLB',50100), +(3162,'Lusaka','ZMB',1317000), +(3163,'Ndola','ZMB',329200), +(3164,'Kitwe','ZMB',288600), +(3165,'Kabwe','ZMB',154300), +(3166,'Chingola','ZMB',142400), +(3167,'Mufulira','ZMB',123900), +(3168,'Luanshya','ZMB',118100), +(3169,'Apia','WSM',35900), +(3170,'Serravalle','SMR',4802), +(3171,'San Marino','SMR',2294), +(3172,'São Tomé','STP',49541), +(3173,'Riyadh','SAU',3324000), +(3174,'Jedda','SAU',2046300), +(3175,'Mekka','SAU',965700), +(3176,'Medina','SAU',608300), +(3177,'al-Dammam','SAU',482300), +(3178,'al-Taif','SAU',416100), +(3179,'Tabuk','SAU',292600), +(3180,'Burayda','SAU',248600), +(3181,'al-Hufuf','SAU',225800), +(3182,'al-Mubarraz','SAU',219100), +(3183,'Khamis Mushayt','SAU',217900), +(3184,'Hail','SAU',176800), +(3185,'al-Kharj','SAU',152100), +(3186,'al-Khubar','SAU',141700), +(3187,'Jubayl','SAU',140800), +(3188,'Hafar al-Batin','SAU',137800), +(3189,'al-Tuqba','SAU',125700), +(3190,'Yanbu','SAU',119800), +(3191,'Abha','SAU',112300), +(3192,'Ara´ar','SAU',108100), +(3193,'al-Qatif','SAU',98900), +(3194,'al-Hawiya','SAU',93900), +(3195,'Unayza','SAU',91100), +(3196,'Najran','SAU',91000), +(3197,'Pikine','SEN',855287), +(3198,'Dakar','SEN',785071), +(3199,'Thiès','SEN',248000), +(3200,'Kaolack','SEN',199000); +INSERT INTO City VALUES +(3201,'Ziguinchor','SEN',192000), +(3202,'Rufisque','SEN',150000), +(3203,'Saint-Louis','SEN',132400), +(3204,'Mbour','SEN',109300), +(3205,'Diourbel','SEN',99400), +(3206,'Victoria','SYC',41000), +(3207,'Freetown','SLE',850000), +(3208,'Singapore','SGP',4017733), +(3209,'Bratislava','SVK',448292), +(3210,'Koice','SVK',241874), +(3211,'Preov','SVK',93977), +(3212,'Ljubljana','SVN',270986), +(3213,'Maribor','SVN',115532), +(3214,'Mogadishu','SOM',997000), +(3215,'Hargeysa','SOM',90000), +(3216,'Kismaayo','SOM',90000), +(3217,'Colombo','LKA',645000), +(3218,'Dehiwala','LKA',203000), +(3219,'Moratuwa','LKA',190000), +(3220,'Jaffna','LKA',149000), +(3221,'Kandy','LKA',140000), +(3222,'Sri Jayawardenepura Kotte','LKA',118000), +(3223,'Negombo','LKA',100000), +(3224,'Omdurman','SDN',1271403), +(3225,'Khartum','SDN',947483), +(3226,'Sharq al-Nil','SDN',700887), +(3227,'Port Sudan','SDN',308195), +(3228,'Kassala','SDN',234622), +(3229,'Obeid','SDN',229425), +(3230,'Nyala','SDN',227183), +(3231,'Wad Madani','SDN',211362), +(3232,'al-Qadarif','SDN',191164), +(3233,'Kusti','SDN',173599), +(3234,'al-Fashir','SDN',141884), +(3235,'Juba','SDN',114980), +(3236,'Helsinki [Helsingfors]','FIN',555474), +(3237,'Espoo','FIN',213271), +(3238,'Tampere','FIN',195468), +(3239,'Vantaa','FIN',178471), +(3240,'Turku [Åbo]','FIN',172561), +(3241,'Oulu','FIN',120753), +(3242,'Lahti','FIN',96921), +(3243,'Paramaribo','SUR',112000), +(3244,'Mbabane','SWZ',61000), +(3245,'Zürich','CHE',336800), +(3246,'Geneve','CHE',173500), +(3247,'Basel','CHE',166700), +(3248,'Bern','CHE',122700), +(3249,'Lausanne','CHE',114500), +(3250,'Damascus','SYR',1347000), +(3251,'Aleppo','SYR',1261983), +(3252,'Hims','SYR',507404), +(3253,'Hama','SYR',343361), +(3254,'Latakia','SYR',264563), +(3255,'al-Qamishliya','SYR',144286), +(3256,'Dayr al-Zawr','SYR',140459), +(3257,'Jaramana','SYR',138469), +(3258,'Duma','SYR',131158), +(3259,'al-Raqqa','SYR',108020), +(3260,'Idlib','SYR',91081), +(3261,'Dushanbe','TJK',524000), +(3262,'Khujand','TJK',161500), +(3263,'Taipei','TWN',2641312), +(3264,'Kaohsiung','TWN',1475505), +(3265,'Taichung','TWN',940589), +(3266,'Tainan','TWN',728060), +(3267,'Panchiao','TWN',523850), +(3268,'Chungho','TWN',392176), +(3269,'Keelung (Chilung)','TWN',385201), +(3270,'Sanchung','TWN',380084), +(3271,'Hsinchuang','TWN',365048), +(3272,'Hsinchu','TWN',361958), +(3273,'Chungli','TWN',318649), +(3274,'Fengshan','TWN',318562), +(3275,'Taoyuan','TWN',316438), +(3276,'Chiayi','TWN',265109), +(3277,'Hsintien','TWN',263603), +(3278,'Changhwa','TWN',227715), +(3279,'Yungho','TWN',227700), +(3280,'Tucheng','TWN',224897), +(3281,'Pingtung','TWN',214727), +(3282,'Yungkang','TWN',193005), +(3283,'Pingchen','TWN',188344), +(3284,'Tali','TWN',171940), +(3285,'Taiping','TWN',165524), +(3286,'Pate','TWN',161700), +(3287,'Fengyuan','TWN',161032), +(3288,'Luchou','TWN',160516), +(3289,'Hsichuh','TWN',154976), +(3290,'Shulin','TWN',151260), +(3291,'Yuanlin','TWN',126402), +(3292,'Yangmei','TWN',126323), +(3293,'Taliao','TWN',115897), +(3294,'Kueishan','TWN',112195), +(3295,'Tanshui','TWN',111882), +(3296,'Taitung','TWN',111039), +(3297,'Hualien','TWN',108407), +(3298,'Nantou','TWN',104723), +(3299,'Lungtan','TWN',103088), +(3300,'Touliu','TWN',98900), +(3301,'Tsaotun','TWN',96800), +(3302,'Kangshan','TWN',92200), +(3303,'Ilan','TWN',92000), +(3304,'Miaoli','TWN',90000), +(3305,'Dar es Salaam','TZA',1747000), +(3306,'Dodoma','TZA',189000), +(3307,'Mwanza','TZA',172300), +(3308,'Zanzibar','TZA',157634), +(3309,'Tanga','TZA',137400), +(3310,'Mbeya','TZA',130800), +(3311,'Morogoro','TZA',117800), +(3312,'Arusha','TZA',102500), +(3313,'Moshi','TZA',96800), +(3314,'Tabora','TZA',92800), +(3315,'København','DNK',495699), +(3316,'Århus','DNK',284846), +(3317,'Odense','DNK',183912), +(3318,'Aalborg','DNK',161161), +(3319,'Frederiksberg','DNK',90327), +(3320,'Bangkok','THA',6320174), +(3321,'Nonthaburi','THA',292100), +(3322,'Nakhon Ratchasima','THA',181400), +(3323,'Chiang Mai','THA',171100), +(3324,'Udon Thani','THA',158100), +(3325,'Hat Yai','THA',148632), +(3326,'Khon Kaen','THA',126500), +(3327,'Pak Kret','THA',126055), +(3328,'Nakhon Sawan','THA',123800), +(3329,'Ubon Ratchathani','THA',116300), +(3330,'Songkhla','THA',94900), +(3331,'Nakhon Pathom','THA',94100), +(3332,'Lomé','TGO',375000), +(3333,'Fakaofo','TKL',300), +(3334,'Nuku´alofa','TON',22400), +(3335,'Chaguanas','TTO',56601), +(3336,'Port-of-Spain','TTO',43396), +(3337,'N´Djaména','TCD',530965), +(3338,'Moundou','TCD',99500), +(3339,'Praha','CZE',1181126), +(3340,'Brno','CZE',381862), +(3341,'Ostrava','CZE',320041), +(3342,'Plzen','CZE',166759), +(3343,'Olomouc','CZE',102702), +(3344,'Liberec','CZE',99155), +(3345,'Ceské Budejovice','CZE',98186), +(3346,'Hradec Králové','CZE',98080), +(3347,'Ústí nad Labem','CZE',95491), +(3348,'Pardubice','CZE',91309), +(3349,'Tunis','TUN',690600), +(3350,'Sfax','TUN',257800), +(3351,'Ariana','TUN',197000), +(3352,'Ettadhamen','TUN',178600), +(3353,'Sousse','TUN',145900), +(3354,'Kairouan','TUN',113100), +(3355,'Biserta','TUN',108900), +(3356,'Gabès','TUN',106600), +(3357,'Istanbul','TUR',8787958), +(3358,'Ankara','TUR',3038159), +(3359,'Izmir','TUR',2130359), +(3360,'Adana','TUR',1131198), +(3361,'Bursa','TUR',1095842), +(3362,'Gaziantep','TUR',789056), +(3363,'Konya','TUR',628364), +(3364,'Mersin (Içel)','TUR',587212), +(3365,'Antalya','TUR',564914), +(3366,'Diyarbakir','TUR',479884), +(3367,'Kayseri','TUR',475657), +(3368,'Eskisehir','TUR',470781), +(3369,'Sanliurfa','TUR',405905), +(3370,'Samsun','TUR',339871), +(3371,'Malatya','TUR',330312), +(3372,'Gebze','TUR',264170), +(3373,'Denizli','TUR',253848), +(3374,'Sivas','TUR',246642), +(3375,'Erzurum','TUR',246535), +(3376,'Tarsus','TUR',246206), +(3377,'Kahramanmaras','TUR',245772), +(3378,'Elâzig','TUR',228815), +(3379,'Van','TUR',219319), +(3380,'Sultanbeyli','TUR',211068), +(3381,'Izmit (Kocaeli)','TUR',210068), +(3382,'Manisa','TUR',207148), +(3383,'Batman','TUR',203793), +(3384,'Balikesir','TUR',196382), +(3385,'Sakarya (Adapazari)','TUR',190641), +(3386,'Iskenderun','TUR',153022), +(3387,'Osmaniye','TUR',146003), +(3388,'Çorum','TUR',145495), +(3389,'Kütahya','TUR',144761), +(3390,'Hatay (Antakya)','TUR',143982), +(3391,'Kirikkale','TUR',142044), +(3392,'Adiyaman','TUR',141529), +(3393,'Trabzon','TUR',138234), +(3394,'Ordu','TUR',133642), +(3395,'Aydin','TUR',128651), +(3396,'Usak','TUR',128162), +(3397,'Edirne','TUR',123383), +(3398,'Çorlu','TUR',123300), +(3399,'Isparta','TUR',121911), +(3400,'Karabük','TUR',118285); +INSERT INTO City VALUES +(3401,'Kilis','TUR',118245), +(3402,'Alanya','TUR',117300), +(3403,'Kiziltepe','TUR',112000), +(3404,'Zonguldak','TUR',111542), +(3405,'Siirt','TUR',107100), +(3406,'Viransehir','TUR',106400), +(3407,'Tekirdag','TUR',106077), +(3408,'Karaman','TUR',104200), +(3409,'Afyon','TUR',103984), +(3410,'Aksaray','TUR',102681), +(3411,'Ceyhan','TUR',102412), +(3412,'Erzincan','TUR',102304), +(3413,'Bismil','TUR',101400), +(3414,'Nazilli','TUR',99900), +(3415,'Tokat','TUR',99500), +(3416,'Kars','TUR',93000), +(3417,'Inegöl','TUR',90500), +(3418,'Bandirma','TUR',90200), +(3419,'Ashgabat','TKM',540600), +(3420,'Chärjew','TKM',189200), +(3421,'Dashhowuz','TKM',141800), +(3422,'Mary','TKM',101000), +(3423,'Cockburn Town','TCA',4800), +(3424,'Funafuti','TUV',4600), +(3425,'Kampala','UGA',890800), +(3426,'Kyiv','UKR',2624000), +(3427,'Harkova [Harkiv]','UKR',1500000), +(3428,'Dnipropetrovsk','UKR',1103000), +(3429,'Donetsk','UKR',1050000), +(3430,'Odesa','UKR',1011000), +(3431,'Zaporizzja','UKR',848000), +(3432,'Lviv','UKR',788000), +(3433,'Kryvyi Rig','UKR',703000), +(3434,'Mykolajiv','UKR',508000), +(3435,'Mariupol','UKR',490000), +(3436,'Lugansk','UKR',469000), +(3437,'Vinnytsja','UKR',391000), +(3438,'Makijivka','UKR',384000), +(3439,'Herson','UKR',353000), +(3440,'Sevastopol','UKR',348000), +(3441,'Simferopol','UKR',339000), +(3442,'Pultava [Poltava]','UKR',313000), +(3443,'Ternigiv','UKR',313000), +(3444,'Terkasy','UKR',309000), +(3445,'Gorlivka','UKR',299000), +(3446,'Zytomyr','UKR',297000), +(3447,'Sumy','UKR',294000), +(3448,'Dniprodzerzynsk','UKR',270000), +(3449,'Kirovograd','UKR',265000), +(3450,'Hmelnytskyi','UKR',262000), +(3451,'Ternivtsi','UKR',259000), +(3452,'Rivne','UKR',245000), +(3453,'Krementuk','UKR',239000), +(3454,'Ivano-Frankivsk','UKR',237000), +(3455,'Ternopil','UKR',236000), +(3456,'Lutsk','UKR',217000), +(3457,'Bila Tserkva','UKR',215000), +(3458,'Kramatorsk','UKR',186000), +(3459,'Melitopol','UKR',169000), +(3460,'Kert','UKR',162000), +(3461,'Nikopol','UKR',149000), +(3462,'Berdjansk','UKR',130000), +(3463,'Pavlograd','UKR',127000), +(3464,'Sjeverodonetsk','UKR',127000), +(3465,'Slovjansk','UKR',127000), +(3466,'Uzgorod','UKR',127000), +(3467,'Altevsk','UKR',119000), +(3468,'Lysytansk','UKR',116000), +(3469,'Jevpatorija','UKR',112000), +(3470,'Kamjanets-Podilskyi','UKR',109000), +(3471,'Jenakijeve','UKR',105000), +(3472,'Krasnyi Lut','UKR',101000), +(3473,'Stahanov','UKR',101000), +(3474,'Oleksandrija','UKR',99000), +(3475,'Konotop','UKR',96000), +(3476,'Kostjantynivka','UKR',95000), +(3477,'Berdytiv','UKR',90000), +(3478,'Izmajil','UKR',90000), +(3479,'ostka','UKR',90000), +(3480,'Uman','UKR',90000), +(3481,'Brovary','UKR',89000), +(3482,'Mukateve','UKR',89000), +(3483,'Budapest','HUN',1811552), +(3484,'Debrecen','HUN',203648), +(3485,'Miskolc','HUN',172357), +(3486,'Szeged','HUN',158158), +(3487,'Pécs','HUN',157332), +(3488,'Györ','HUN',127119), +(3489,'Nyiregyháza','HUN',112419), +(3490,'Kecskemét','HUN',105606), +(3491,'Székesfehérvár','HUN',105119), +(3492,'Montevideo','URY',1236000), +(3493,'Nouméa','NCL',76293), +(3494,'Auckland','NZL',381800), +(3495,'Christchurch','NZL',324200), +(3496,'Manukau','NZL',281800), +(3497,'North Shore','NZL',187700), +(3498,'Waitakere','NZL',170600), +(3499,'Wellington','NZL',166700), +(3500,'Dunedin','NZL',119600), +(3501,'Hamilton','NZL',117100), +(3502,'Lower Hutt','NZL',98100), +(3503,'Toskent','UZB',2117500), +(3504,'Namangan','UZB',370500), +(3505,'Samarkand','UZB',361800), +(3506,'Andijon','UZB',318600), +(3507,'Buhoro','UZB',237100), +(3508,'Karsi','UZB',194100), +(3509,'Nukus','UZB',194100), +(3510,'Kükon','UZB',190100), +(3511,'Fargona','UZB',180500), +(3512,'Circik','UZB',146400), +(3513,'Margilon','UZB',140800), +(3514,'Ürgenc','UZB',138900), +(3515,'Angren','UZB',128000), +(3516,'Cizah','UZB',124800), +(3517,'Navoi','UZB',116300), +(3518,'Olmalik','UZB',114900), +(3519,'Termiz','UZB',109500), +(3520,'Minsk','BLR',1674000), +(3521,'Gomel','BLR',475000), +(3522,'Mogiljov','BLR',356000), +(3523,'Vitebsk','BLR',340000), +(3524,'Grodno','BLR',302000), +(3525,'Brest','BLR',286000), +(3526,'Bobruisk','BLR',221000), +(3527,'Baranoviti','BLR',167000), +(3528,'Borisov','BLR',151000), +(3529,'Pinsk','BLR',130000), +(3530,'Ora','BLR',124000), +(3531,'Mozyr','BLR',110000), +(3532,'Novopolotsk','BLR',106000), +(3533,'Lida','BLR',101000), +(3534,'Soligorsk','BLR',101000), +(3535,'Molodetno','BLR',97000), +(3536,'Mata-Utu','WLF',1137), +(3537,'Port-Vila','VUT',33700), +(3538,'Città del Vaticano','VAT',455), +(3539,'Caracas','VEN',1975294), +(3540,'Maracaíbo','VEN',1304776), +(3541,'Barquisimeto','VEN',877239), +(3542,'Valencia','VEN',794246), +(3543,'Ciudad Guayana','VEN',663713), +(3544,'Petare','VEN',488868), +(3545,'Maracay','VEN',444443), +(3546,'Barcelona','VEN',322267), +(3547,'Maturín','VEN',319726), +(3548,'San Cristóbal','VEN',319373), +(3549,'Ciudad Bolívar','VEN',301107), +(3550,'Cumaná','VEN',293105), +(3551,'Mérida','VEN',224887), +(3552,'Cabimas','VEN',221329), +(3553,'Barinas','VEN',217831), +(3554,'Turmero','VEN',217499), +(3555,'Baruta','VEN',207290), +(3556,'Puerto Cabello','VEN',187722), +(3557,'Santa Ana de Coro','VEN',185766), +(3558,'Los Teques','VEN',178784), +(3559,'Punto Fijo','VEN',167215), +(3560,'Guarenas','VEN',165889), +(3561,'Acarigua','VEN',158954), +(3562,'Puerto La Cruz','VEN',155700), +(3563,'Ciudad Losada','VEN',134501), +(3564,'Guacara','VEN',131334), +(3565,'Valera','VEN',130281), +(3566,'Guanare','VEN',125621), +(3567,'Carúpano','VEN',119639), +(3568,'Catia La Mar','VEN',117012), +(3569,'El Tigre','VEN',116256), +(3570,'Guatire','VEN',109121), +(3571,'Calabozo','VEN',107146), +(3572,'Pozuelos','VEN',105690), +(3573,'Ciudad Ojeda','VEN',99354), +(3574,'Ocumare del Tuy','VEN',97168), +(3575,'Valle de la Pascua','VEN',95927), +(3576,'Araure','VEN',94269), +(3577,'San Fernando de Apure','VEN',93809), +(3578,'San Felipe','VEN',90940), +(3579,'El Limón','VEN',90000), +(3580,'Moscow','RUS',8389200), +(3581,'St Petersburg','RUS',4694000), +(3582,'Novosibirsk','RUS',1398800), +(3583,'Nizni Novgorod','RUS',1357000), +(3584,'Jekaterinburg','RUS',1266300), +(3585,'Samara','RUS',1156100), +(3586,'Omsk','RUS',1148900), +(3587,'Kazan','RUS',1101000), +(3588,'Ufa','RUS',1091200), +(3589,'Teljabinsk','RUS',1083200), +(3590,'Rostov-na-Donu','RUS',1012700), +(3591,'Perm','RUS',1009700), +(3592,'Volgograd','RUS',993400), +(3593,'Voronez','RUS',907700), +(3594,'Krasnojarsk','RUS',875500), +(3595,'Saratov','RUS',874000), +(3596,'Toljatti','RUS',722900), +(3597,'Uljanovsk','RUS',667400), +(3598,'Izevsk','RUS',652800), +(3599,'Krasnodar','RUS',639000), +(3600,'Jaroslavl','RUS',616700); +INSERT INTO City VALUES +(3601,'Habarovsk','RUS',609400), +(3602,'Vladivostok','RUS',606200), +(3603,'Irkutsk','RUS',593700), +(3604,'Barnaul','RUS',580100), +(3605,'Novokuznetsk','RUS',561600), +(3606,'Penza','RUS',532200), +(3607,'Rjazan','RUS',529900), +(3608,'Orenburg','RUS',523600), +(3609,'Lipetsk','RUS',521000), +(3610,'Nabereznyje Telny','RUS',514700), +(3611,'Tula','RUS',506100), +(3612,'Tjumen','RUS',503400), +(3613,'Kemerovo','RUS',492700), +(3614,'Astrahan','RUS',486100), +(3615,'Tomsk','RUS',482100), +(3616,'Kirov','RUS',466200), +(3617,'Ivanovo','RUS',459200), +(3618,'Teboksary','RUS',459200), +(3619,'Brjansk','RUS',457400), +(3620,'Tver','RUS',454900), +(3621,'Kursk','RUS',443500), +(3622,'Magnitogorsk','RUS',427900), +(3623,'Kaliningrad','RUS',424400), +(3624,'Nizni Tagil','RUS',390900), +(3625,'Murmansk','RUS',376300), +(3626,'Ulan-Ude','RUS',370400), +(3627,'Kurgan','RUS',364700), +(3628,'Arkangeli','RUS',361800), +(3629,'Soti','RUS',358600), +(3630,'Smolensk','RUS',353400), +(3631,'Orjol','RUS',344500), +(3632,'Stavropol','RUS',343300), +(3633,'Belgorod','RUS',342000), +(3634,'Kaluga','RUS',339300), +(3635,'Vladimir','RUS',337100), +(3636,'Mahatkala','RUS',332800), +(3637,'Terepovets','RUS',324400), +(3638,'Saransk','RUS',314800), +(3639,'Tambov','RUS',312000), +(3640,'Vladikavkaz','RUS',310100), +(3641,'Tita','RUS',309900), +(3642,'Vologda','RUS',302500), +(3643,'Veliki Novgorod','RUS',299500), +(3644,'Komsomolsk-na-Amure','RUS',291600), +(3645,'Kostroma','RUS',288100), +(3646,'Volzski','RUS',286900), +(3647,'Taganrog','RUS',284400), +(3648,'Petroskoi','RUS',282100), +(3649,'Bratsk','RUS',277600), +(3650,'Dzerzinsk','RUS',277100), +(3651,'Surgut','RUS',274900), +(3652,'Orsk','RUS',273900), +(3653,'Sterlitamak','RUS',265200), +(3654,'Angarsk','RUS',264700), +(3655,'Jokar-Ola','RUS',249200), +(3656,'Rybinsk','RUS',239600), +(3657,'Prokopjevsk','RUS',237300), +(3658,'Niznevartovsk','RUS',233900), +(3659,'Naltik','RUS',233400), +(3660,'Syktyvkar','RUS',229700), +(3661,'Severodvinsk','RUS',229300), +(3662,'Bijsk','RUS',225000), +(3663,'Niznekamsk','RUS',223400), +(3664,'Blagovetensk','RUS',222000), +(3665,'ahty','RUS',221800), +(3666,'Staryi Oskol','RUS',213800), +(3667,'Zelenograd','RUS',207100), +(3668,'Balakovo','RUS',206000), +(3669,'Novorossijsk','RUS',203300), +(3670,'Pihkova','RUS',201500), +(3671,'Zlatoust','RUS',196900), +(3672,'Jakutsk','RUS',195400), +(3673,'Podolsk','RUS',194300), +(3674,'Petropavlovsk-Kamtatski','RUS',194100), +(3675,'Kamensk-Uralski','RUS',190600), +(3676,'Engels','RUS',189000), +(3677,'Syzran','RUS',186900), +(3678,'Grozny','RUS',186000), +(3679,'Novoterkassk','RUS',184400), +(3680,'Berezniki','RUS',181900), +(3681,'Juzno-Sahalinsk','RUS',179200), +(3682,'Volgodonsk','RUS',178200), +(3683,'Abakan','RUS',169200), +(3684,'Maikop','RUS',167300), +(3685,'Miass','RUS',166200), +(3686,'Armavir','RUS',164900), +(3687,'Ljubertsy','RUS',163900), +(3688,'Rubtsovsk','RUS',162600), +(3689,'Kovrov','RUS',159900), +(3690,'Nahodka','RUS',157700), +(3691,'Ussurijsk','RUS',157300), +(3692,'Salavat','RUS',156800), +(3693,'Mytiti','RUS',155700), +(3694,'Kolomna','RUS',150700), +(3695,'Elektrostal','RUS',147000), +(3696,'Murom','RUS',142400), +(3697,'Kolpino','RUS',141200), +(3698,'Norilsk','RUS',140800), +(3699,'Almetjevsk','RUS',140700), +(3700,'Novomoskovsk','RUS',138100), +(3701,'Dimitrovgrad','RUS',137000), +(3702,'Pervouralsk','RUS',136100), +(3703,'Himki','RUS',133700), +(3704,'Balaiha','RUS',132900), +(3705,'Nevinnomyssk','RUS',132600), +(3706,'Pjatigorsk','RUS',132500), +(3707,'Korolev','RUS',132400), +(3708,'Serpuhov','RUS',132000), +(3709,'Odintsovo','RUS',127400), +(3710,'Orehovo-Zujevo','RUS',124900), +(3711,'Kamyin','RUS',124600), +(3712,'Novoteboksarsk','RUS',123400), +(3713,'Terkessk','RUS',121700), +(3714,'Atinsk','RUS',121600), +(3715,'Magadan','RUS',121000), +(3716,'Miturinsk','RUS',120700), +(3717,'Kislovodsk','RUS',120400), +(3718,'Jelets','RUS',119400), +(3719,'Seversk','RUS',118600), +(3720,'Noginsk','RUS',117200), +(3721,'Velikije Luki','RUS',116300), +(3722,'Novokuibyevsk','RUS',116200), +(3723,'Neftekamsk','RUS',115700), +(3724,'Leninsk-Kuznetski','RUS',113800), +(3725,'Oktjabrski','RUS',111500), +(3726,'Sergijev Posad','RUS',111100), +(3727,'Arzamas','RUS',110700), +(3728,'Kiseljovsk','RUS',110000), +(3729,'Novotroitsk','RUS',109600), +(3730,'Obninsk','RUS',108300), +(3731,'Kansk','RUS',107400), +(3732,'Glazov','RUS',106300), +(3733,'Solikamsk','RUS',106000), +(3734,'Sarapul','RUS',105700), +(3735,'Ust-Ilimsk','RUS',105200), +(3736,'tolkovo','RUS',104900), +(3737,'Mezduretensk','RUS',104400), +(3738,'Usolje-Sibirskoje','RUS',103500), +(3739,'Elista','RUS',103300), +(3740,'Novoahtinsk','RUS',101900), +(3741,'Votkinsk','RUS',101700), +(3742,'Kyzyl','RUS',101100), +(3743,'Serov','RUS',100400), +(3744,'Zelenodolsk','RUS',100200), +(3745,'Zeleznodoroznyi','RUS',100100), +(3746,'Kinema','RUS',100000), +(3747,'Kuznetsk','RUS',98200), +(3748,'Uhta','RUS',98000), +(3749,'Jessentuki','RUS',97900), +(3750,'Tobolsk','RUS',97600), +(3751,'Neftejugansk','RUS',97400), +(3752,'Bataisk','RUS',97300), +(3753,'Nojabrsk','RUS',97300), +(3754,'Balaov','RUS',97100), +(3755,'Zeleznogorsk','RUS',96900), +(3756,'Zukovski','RUS',96500), +(3757,'Anzero-Sudzensk','RUS',96100), +(3758,'Bugulma','RUS',94100), +(3759,'Zeleznogorsk','RUS',94000), +(3760,'Novouralsk','RUS',93300), +(3761,'Pukin','RUS',92900), +(3762,'Vorkuta','RUS',92600), +(3763,'Derbent','RUS',92300), +(3764,'Kirovo-Tepetsk','RUS',91600), +(3765,'Krasnogorsk','RUS',91000), +(3766,'Klin','RUS',90000), +(3767,'Taikovski','RUS',90000), +(3768,'Novyi Urengoi','RUS',89800), +(3769,'Ho Chi Minh City','VNM',3980000), +(3770,'Hanoi','VNM',1410000), +(3771,'Haiphong','VNM',783133), +(3772,'Da Nang','VNM',382674), +(3773,'Biên Hoa','VNM',282095), +(3774,'Nha Trang','VNM',221331), +(3775,'Hue','VNM',219149), +(3776,'Can Tho','VNM',215587), +(3777,'Cam Pha','VNM',209086), +(3778,'Nam Dinh','VNM',171699), +(3779,'Quy Nhon','VNM',163385), +(3780,'Vung Tau','VNM',145145), +(3781,'Rach Gia','VNM',141132), +(3782,'Long Xuyen','VNM',132681), +(3783,'Thai Nguyen','VNM',127643), +(3784,'Hong Gai','VNM',127484), +(3785,'Phan Thiêt','VNM',114236), +(3786,'Cam Ranh','VNM',114041), +(3787,'Vinh','VNM',112455), +(3788,'My Tho','VNM',108404), +(3789,'Da Lat','VNM',106409), +(3790,'Buon Ma Thuot','VNM',97044), +(3791,'Tallinn','EST',403981), +(3792,'Tartu','EST',101246), +(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); +INSERT INTO City VALUES +(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), +(3808,'Austin','USA',656562), +(3809,'Baltimore','USA',651154), +(3810,'Memphis','USA',650100), +(3811,'Milwaukee','USA',596974), +(3812,'Boston','USA',589141), +(3813,'Washington','USA',572059), +(3814,'Nashville-Davidson','USA',569891), +(3815,'El Paso','USA',563662), +(3816,'Seattle','USA',563374), +(3817,'Denver','USA',554636), +(3818,'Charlotte','USA',540828), +(3819,'Fort Worth','USA',534694), +(3820,'Portland','USA',529121), +(3821,'Oklahoma City','USA',506132), +(3822,'Tucson','USA',486699), +(3823,'New Orleans','USA',484674), +(3824,'Las Vegas','USA',478434), +(3825,'Cleveland','USA',478403), +(3826,'Long Beach','USA',461522), +(3827,'Albuquerque','USA',448607), +(3828,'Kansas City','USA',441545), +(3829,'Fresno','USA',427652), +(3830,'Virginia Beach','USA',425257), +(3831,'Atlanta','USA',416474), +(3832,'Sacramento','USA',407018), +(3833,'Oakland','USA',399484), +(3834,'Mesa','USA',396375), +(3835,'Tulsa','USA',393049), +(3836,'Omaha','USA',390007), +(3837,'Minneapolis','USA',382618), +(3838,'Honolulu','USA',371657), +(3839,'Miami','USA',362470), +(3840,'Colorado Springs','USA',360890), +(3841,'Saint Louis','USA',348189), +(3842,'Wichita','USA',344284), +(3843,'Santa Ana','USA',337977), +(3844,'Pittsburgh','USA',334563), +(3845,'Arlington','USA',332969), +(3846,'Cincinnati','USA',331285), +(3847,'Anaheim','USA',328014), +(3848,'Toledo','USA',313619), +(3849,'Tampa','USA',303447), +(3850,'Buffalo','USA',292648), +(3851,'Saint Paul','USA',287151), +(3852,'Corpus Christi','USA',277454), +(3853,'Aurora','USA',276393), +(3854,'Raleigh','USA',276093), +(3855,'Newark','USA',273546), +(3856,'Lexington-Fayette','USA',260512), +(3857,'Anchorage','USA',260283), +(3858,'Louisville','USA',256231), +(3859,'Riverside','USA',255166), +(3860,'Saint Petersburg','USA',248232), +(3861,'Bakersfield','USA',247057), +(3862,'Stockton','USA',243771), +(3863,'Birmingham','USA',242820), +(3864,'Jersey City','USA',240055), +(3865,'Norfolk','USA',234403), +(3866,'Baton Rouge','USA',227818), +(3867,'Hialeah','USA',226419), +(3868,'Lincoln','USA',225581), +(3869,'Greensboro','USA',223891), +(3870,'Plano','USA',222030), +(3871,'Rochester','USA',219773), +(3872,'Glendale','USA',218812), +(3873,'Akron','USA',217074), +(3874,'Garland','USA',215768), +(3875,'Madison','USA',208054), +(3876,'Fort Wayne','USA',205727), +(3877,'Fremont','USA',203413), +(3878,'Scottsdale','USA',202705), +(3879,'Montgomery','USA',201568), +(3880,'Shreveport','USA',200145), +(3881,'Augusta-Richmond County','USA',199775), +(3882,'Lubbock','USA',199564), +(3883,'Chesapeake','USA',199184), +(3884,'Mobile','USA',198915), +(3885,'Des Moines','USA',198682), +(3886,'Grand Rapids','USA',197800), +(3887,'Richmond','USA',197790), +(3888,'Yonkers','USA',196086), +(3889,'Spokane','USA',195629), +(3890,'Glendale','USA',194973), +(3891,'Tacoma','USA',193556), +(3892,'Irving','USA',191615), +(3893,'Huntington Beach','USA',189594), +(3894,'Modesto','USA',188856), +(3895,'Durham','USA',187035), +(3896,'Columbus','USA',186291), +(3897,'Orlando','USA',185951), +(3898,'Boise City','USA',185787), +(3899,'Winston-Salem','USA',185776), +(3900,'San Bernardino','USA',185401), +(3901,'Jackson','USA',184256), +(3902,'Little Rock','USA',183133), +(3903,'Salt Lake City','USA',181743), +(3904,'Reno','USA',180480), +(3905,'Newport News','USA',180150), +(3906,'Chandler','USA',176581), +(3907,'Laredo','USA',176576), +(3908,'Henderson','USA',175381), +(3909,'Arlington','USA',174838), +(3910,'Knoxville','USA',173890), +(3911,'Amarillo','USA',173627), +(3912,'Providence','USA',173618), +(3913,'Chula Vista','USA',173556), +(3914,'Worcester','USA',172648), +(3915,'Oxnard','USA',170358), +(3916,'Dayton','USA',166179), +(3917,'Garden Grove','USA',165196), +(3918,'Oceanside','USA',161029), +(3919,'Tempe','USA',158625), +(3920,'Huntsville','USA',158216), +(3921,'Ontario','USA',158007), +(3922,'Chattanooga','USA',155554), +(3923,'Fort Lauderdale','USA',152397), +(3924,'Springfield','USA',152082), +(3925,'Springfield','USA',151580), +(3926,'Santa Clarita','USA',151088), +(3927,'Salinas','USA',151060), +(3928,'Tallahassee','USA',150624), +(3929,'Rockford','USA',150115), +(3930,'Pomona','USA',149473), +(3931,'Metairie','USA',149428), +(3932,'Paterson','USA',149222), +(3933,'Overland Park','USA',149080), +(3934,'Santa Rosa','USA',147595), +(3935,'Syracuse','USA',147306), +(3936,'Kansas City','USA',146866), +(3937,'Hampton','USA',146437), +(3938,'Lakewood','USA',144126), +(3939,'Vancouver','USA',143560), +(3940,'Irvine','USA',143072), +(3941,'Aurora','USA',142990), +(3942,'Moreno Valley','USA',142381), +(3943,'Pasadena','USA',141674), +(3944,'Hayward','USA',140030), +(3945,'Brownsville','USA',139722), +(3946,'Bridgeport','USA',139529), +(3947,'Hollywood','USA',139357), +(3948,'Warren','USA',138247), +(3949,'Torrance','USA',137946), +(3950,'Eugene','USA',137893), +(3951,'Pembroke Pines','USA',137427), +(3952,'Salem','USA',136924), +(3953,'Pasadena','USA',133936), +(3954,'Escondido','USA',133559), +(3955,'Sunnyvale','USA',131760), +(3956,'Savannah','USA',131510), +(3957,'Fontana','USA',128929), +(3958,'Orange','USA',128821), +(3959,'Naperville','USA',128358), +(3960,'Alexandria','USA',128283), +(3961,'Rancho Cucamonga','USA',127743), +(3962,'Grand Prairie','USA',127427), +(3963,'East Los Angeles','USA',126379), +(3964,'Fullerton','USA',126003), +(3965,'Corona','USA',124966), +(3966,'Flint','USA',124943), +(3967,'Paradise','USA',124682), +(3968,'Mesquite','USA',124523), +(3969,'Sterling Heights','USA',124471), +(3970,'Sioux Falls','USA',123975), +(3971,'New Haven','USA',123626), +(3972,'Topeka','USA',122377), +(3973,'Concord','USA',121780), +(3974,'Evansville','USA',121582), +(3975,'Hartford','USA',121578), +(3976,'Fayetteville','USA',121015), +(3977,'Cedar Rapids','USA',120758), +(3978,'Elizabeth','USA',120568), +(3979,'Lansing','USA',119128), +(3980,'Lancaster','USA',118718), +(3981,'Fort Collins','USA',118652), +(3982,'Coral Springs','USA',117549), +(3983,'Stamford','USA',117083), +(3984,'Thousand Oaks','USA',117005), +(3985,'Vallejo','USA',116760), +(3986,'Palmdale','USA',116670), +(3987,'Columbia','USA',116278), +(3988,'El Monte','USA',115965), +(3989,'Abilene','USA',115930), +(3990,'North Las Vegas','USA',115488), +(3991,'Ann Arbor','USA',114024), +(3992,'Beaumont','USA',113866), +(3993,'Waco','USA',113726), +(3994,'Macon','USA',113336), +(3995,'Independence','USA',113288), +(3996,'Peoria','USA',112936), +(3997,'Inglewood','USA',112580), +(3998,'Springfield','USA',111454), +(3999,'Simi Valley','USA',111351), +(4000,'Lafayette','USA',110257); +INSERT INTO City VALUES +(4001,'Gilbert','USA',109697), +(4002,'Carrollton','USA',109576), +(4003,'Bellevue','USA',109569), +(4004,'West Valley City','USA',108896), +(4005,'Clarksville','USA',108787), +(4006,'Costa Mesa','USA',108724), +(4007,'Peoria','USA',108364), +(4008,'South Bend','USA',107789), +(4009,'Downey','USA',107323), +(4010,'Waterbury','USA',107271), +(4011,'Manchester','USA',107006), +(4012,'Allentown','USA',106632), +(4013,'McAllen','USA',106414), +(4014,'Joliet','USA',106221), +(4015,'Lowell','USA',105167), +(4016,'Provo','USA',105166), +(4017,'West Covina','USA',105080), +(4018,'Wichita Falls','USA',104197), +(4019,'Erie','USA',103717), +(4020,'Daly City','USA',103621), +(4021,'Citrus Heights','USA',103455), +(4022,'Norwalk','USA',103298), +(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), +(4033,'Westminster','USA',100940), +(4034,'San Buenaventura','USA',100916), +(4035,'Portsmouth','USA',100565), +(4036,'Livonia','USA',100545), +(4037,'Burbank','USA',100316), +(4038,'Clearwater','USA',99936), +(4039,'Midland','USA',98293), +(4040,'Davenport','USA',98256), +(4041,'Mission Viejo','USA',98049), +(4042,'Miami Beach','USA',97855), +(4043,'Sunrise Manor','USA',95362), +(4044,'New Bedford','USA',94780), +(4045,'El Cajon','USA',94578), +(4046,'Norman','USA',94193), +(4047,'Richmond','USA',94100), +(4048,'Albany','USA',93994), +(4049,'Brockton','USA',93653), +(4050,'Roanoke','USA',93357), +(4051,'Billings','USA',92988), +(4052,'Compton','USA',92864), +(4053,'Gainesville','USA',92291), +(4054,'Fairfield','USA',92256), +(4055,'Arden-Arcade','USA',92040), +(4056,'San Mateo','USA',91799), +(4057,'Visalia','USA',91762), +(4058,'Boulder','USA',91238), +(4059,'Cary','USA',91213), +(4060,'Santa Monica','USA',91084), +(4061,'Fall River','USA',90555), +(4062,'Kenosha','USA',89447), +(4063,'Elgin','USA',89408), +(4064,'Odessa','USA',89293), +(4065,'Carson','USA',89089), +(4066,'Charleston','USA',89063), +(4067,'Charlotte Amalie','VIR',13000), +(4068,'Harare','ZWE',1410000), +(4069,'Bulawayo','ZWE',621742), +(4070,'Chitungwiza','ZWE',274912), +(4071,'Mount Darwin','ZWE',164362), +(4072,'Mutare','ZWE',131367), +(4073,'Gweru','ZWE',128037), +(4074,'Gaza','PSE',353632), +(4075,'Khan Yunis','PSE',123175), +(4076,'Hebron','PSE',119401), +(4077,'Jabaliya','PSE',113901), +(4078,'Nablus','PSE',100231), +(4079,'Rafah','PSE',92020); + +# Table CountryLanguage + +INSERT INTO CountryLanguage VALUES +('AFG','Pashto',52.4), +('NLD','Dutch',95.6), +('ANT','Papiamento',86.2), +('ALB','Albaniana',97.9), +('DZA','Arabic',86.0), +('ASM','Samoan',90.6), +('AND','Spanish',44.6), +('AGO','Ovimbundu',37.2), +('AIA','English',0.0), +('ATG','Creole English',95.7), +('ARE','Arabic',42.0), +('ARG','Spanish',96.8), +('ARM','Armenian',93.4), +('ABW','Papiamento',76.7), +('AUS','English',81.2), +('AZE','Azerbaijani',89.0), +('BHS','Creole English',89.7), +('BHR','Arabic',67.7), +('BGD','Bengali',97.7), +('BRB','Bajan',95.1), +('BEL','Dutch',59.2), +('BLZ','English',50.8), +('BEN','Fon',39.8), +('BMU','English',100.0), +('BTN','Dzongkha',50.0), +('BOL','Spanish',87.7), +('BIH','Serbo-Croatian',99.2), +('BWA','Tswana',75.5), +('BRA','Portuguese',97.5), +('GBR','English',97.3), +('VGB','English',0.0), +('BRN','Malay',45.5), +('BGR','Bulgariana',83.2), +('BFA','Mossi',50.2), +('BDI','Kirundi',98.1), +('CYM','English',0.0), +('CHL','Spanish',89.7), +('COK','Maori',0.0), +('CRI','Spanish',97.5), +('DJI','Somali',43.9), +('DMA','Creole English',100.0), +('DOM','Spanish',98.0), +('ECU','Spanish',93.0), +('EGY','Arabic',98.8), +('SLV','Spanish',100.0), +('ERI','Tigrinja',49.1), +('ESP','Spanish',74.4), +('ZAF','Zulu',22.7), +('ETH','Oromo',31.0), +('FLK','English',0.0), +('FJI','Fijian',50.8), +('PHL','Pilipino',29.3), +('FRO','Faroese',100.0), +('GAB','Fang',35.8), +('GMB','Malinke',34.1), +('GEO','Georgiana',71.7), +('GHA','Akan',52.4), +('GIB','English',88.9), +('GRD','Creole English',100.0), +('GRL','Greenlandic',87.5), +('GLP','Creole French',95.0), +('GUM','English',37.5), +('GTM','Spanish',64.7), +('GIN','Ful',38.6), +('GNB','Crioulo',36.4), +('GUY','Creole English',96.4), +('HTI','Haiti Creole',100.0), +('HND','Spanish',97.2), +('HKG','Canton Chinese',88.7), +('SJM','Norwegian',0.0), +('IDN','Javanese',39.4), +('IND','Hindi',39.9), +('IRQ','Arabic',77.2), +('IRN','Persian',45.7), +('IRL','English',98.4), +('ISL','Icelandic',95.7), +('ISR','Hebrew',63.1), +('ITA','Italian',94.1), +('TMP','Sunda',0.0), +('AUT','German',92.0), +('JAM','Creole English',94.2), +('JPN','Japanese',99.1), +('YEM','Arabic',99.6), +('JOR','Arabic',97.9), +('CXR','Chinese',0.0), +('YUG','Serbo-Croatian',75.2), +('KHM','Khmer',88.6), +('CMR','Fang',19.7), +('CAN','English',60.4), +('CPV','Crioulo',100.0), +('KAZ','Kazakh',46.0), +('KEN','Kikuyu',20.9), +('CAF','Gbaya',23.8), +('CHN','Chinese',92.0), +('KGZ','Kirgiz',59.7), +('KIR','Kiribati',98.9), +('COL','Spanish',99.0), +('COM','Comorian',75.0), +('COG','Kongo',51.5), +('COD','Luba',18.0), +('CCK','Malay',0.0), +('PRK','Korean',99.9), +('KOR','Korean',99.9), +('GRC','Greek',98.5), +('HRV','Serbo-Croatian',95.9), +('CUB','Spanish',100.0), +('KWT','Arabic',78.1), +('CYP','Greek',74.1), +('LAO','Lao',67.2), +('LVA','Latvian',55.1), +('LSO','Sotho',85.0), +('LBN','Arabic',93.0), +('LBR','Kpelle',19.5), +('LBY','Arabic',96.0), +('LIE','German',89.0), +('LTU','Lithuanian',81.6), +('LUX','Luxembourgish',64.4), +('ESH','Arabic',100.0), +('MAC','Canton Chinese',85.6), +('MDG','Malagasy',98.9), +('MKD','Macedonian',66.5), +('MWI','Chichewa',58.3), +('MDV','Dhivehi',100.0), +('MYS','Malay',58.4), +('MLI','Bambara',31.8), +('MLT','Maltese',95.8), +('MAR','Arabic',65.0), +('MHL','Marshallese',96.8), +('MTQ','Creole French',96.6), +('MRT','Hassaniya',81.7), +('MUS','Creole French',70.6), +('MYT','Mahoré',41.9), +('MEX','Spanish',92.1), +('FSM','Trukese',41.6), +('MDA','Romanian',61.9), +('MCO','French',41.9), +('MNG','Mongolian',78.8), +('MSR','English',0.0), +('MOZ','Makua',27.8), +('MMR','Burmese',69.0), +('NAM','Ovambo',50.7), +('NRU','Nauru',57.5), +('NPL','Nepali',50.4), +('NIC','Spanish',97.6), +('NER','Hausa',53.1), +('NGA','Joruba',21.4), +('NIU','Niue',0.0), +('NFK','English',0.0), +('NOR','Norwegian',96.6), +('CIV','Akan',30.0), +('OMN','Arabic',76.7), +('PAK','Punjabi',48.2), +('PLW','Palau',82.2), +('PAN','Spanish',76.8), +('PNG','Papuan Languages',78.1), +('PRY','Spanish',55.1), +('PER','Spanish',79.8), +('PCN','Pitcairnese',0.0), +('MNP','Philippene Languages',34.1), +('PRT','Portuguese',99.0), +('PRI','Spanish',51.3), +('POL','Polish',97.6), +('GNQ','Fang',84.8), +('QAT','Arabic',40.7), +('FRA','French',93.6), +('GUF','Creole French',94.3), +('PYF','Tahitian',46.4), +('REU','Creole French',91.5), +('ROM','Romanian',90.7), +('RWA','Rwanda',100.0), +('SWE','Swedish',89.5), +('SHN','English',0.0), +('KNA','Creole English',100.0), +('LCA','Creole French',80.0), +('VCT','Creole English',99.1), +('SPM','French',0.0), +('DEU','German',91.3), +('SLB','Malenasian Languages',85.6), +('ZMB','Bemba',29.7), +('WSM','Samoan-English',52.0), +('SMR','Italian',100.0), +('STP','Crioulo',86.3), +('SAU','Arabic',95.0), +('SEN','Wolof',48.1), +('SYC','Seselwa',91.3), +('SLE','Mende',34.8), +('SGP','Chinese',77.1), +('SVK','Slovak',85.6), +('SVN','Slovene',87.9), +('SOM','Somali',98.3), +('LKA','Singali',60.3), +('SDN','Arabic',49.4), +('FIN','Finnish',92.7), +('SUR','Sranantonga',81.0), +('SWZ','Swazi',89.9), +('CHE','German',63.6), +('SYR','Arabic',90.0), +('TJK','Tadzhik',62.2), +('TWN','Min',66.7), +('TZA','Nyamwesi',21.1); +INSERT INTO CountryLanguage VALUES +('DNK','Danish',93.5), +('THA','Thai',52.6), +('TGO','Ewe',23.2), +('TKL','Tokelau',0.0), +('TON','Tongan',98.3), +('TTO','English',93.5), +('TCD','Sara',27.7), +('CZE','Czech',81.2), +('TUN','Arabic',69.9), +('TUR','Turkish',87.6), +('TKM','Turkmenian',76.7), +('TCA','English',0.0), +('TUV','Tuvalu',92.5), +('UGA','Ganda',18.1), +('UKR','Ukrainian',64.7), +('HUN','Hungarian',98.5), +('URY','Spanish',95.7), +('NCL','Malenasian Languages',45.4), +('NZL','English',87.0), +('UZB','Uzbek',72.6), +('BLR','Belorussian',65.6), +('WLF','Wallis',0.0), +('VUT','Bislama',56.6), +('VAT','Italian',0.0), +('VEN','Spanish',96.9), +('RUS','Russian',86.6), +('VNM','Vietnamese',86.8), +('EST','Estonian',65.3), +('USA','English',86.2), +('VIR','English',81.7), +('UMI','English',0.0), +('ZWE','Shona',72.1), +('PSE','Arabic',95.9), +('AFG','Dari',32.1), +('NLD','Fries',3.7), +('ANT','English',7.8), +('ALB','Greek',1.8), +('DZA','Berberi',14.0), +('ASM','English',3.1), +('AND','Catalan',32.3), +('AGO','Mbundu',21.6), +('ATG','English',0.0), +('ARE','Hindi',0.0), +('ARG','Italian',1.7), +('ARM','Azerbaijani',2.6), +('ABW','English',9.5), +('AUS','Italian',2.2), +('AZE','Russian',3.0), +('BHS','Creole French',10.3), +('BHR','English',0.0), +('BGD','Chakma',0.4), +('BRB','English',0.0), +('BEL','French',32.6), +('BLZ','Spanish',31.6), +('BEN','Joruba',12.2), +('BTN','Nepali',34.8), +('BOL','Ketua',8.1), +('BWA','Shona',12.3), +('BRA','German',0.5), +('GBR','Kymri',0.9), +('BRN','Malay-English',28.8), +('BGR','Turkish',9.4), +('BFA','Ful',9.7), +('BDI','French',0.0), +('CHL','Araucan',9.6), +('COK','English',0.0), +('CRI','Creole English',2.0), +('DJI','Afar',34.8), +('DMA','Creole French',0.0), +('DOM','Creole French',2.0), +('ECU','Ketua',7.0), +('EGY','Sinaberberi',0.0), +('SLV','Nahua',0.0), +('ERI','Tigre',31.7), +('ESP','Catalan',16.9), +('ZAF','Xhosa',17.7), +('ETH','Amhara',30.0), +('FJI','Hindi',43.7), +('PHL','Cebuano',23.3), +('FRO','Danish',0.0), +('GAB','Punu-sira-nzebi',17.1), +('GMB','Ful',16.2), +('GEO','Russian',8.8), +('GHA','Mossi',15.8), +('GIB','Arabic',7.4), +('GRL','Danish',12.5), +('GLP','French',0.0), +('GUM','Chamorro',29.6), +('GTM','Quiché',10.1), +('GIN','Malinke',23.2), +('GNB','Ful',16.6), +('GUY','Caribbean',2.2), +('HTI','French',0.0), +('HND','Garifuna',1.3), +('HKG','English',2.2), +('SJM','Russian',0.0), +('IDN','Sunda',15.8), +('IND','Bengali',8.2), +('IRQ','Kurdish',19.0), +('IRN','Azerbaijani',16.8), +('IRL','Irish',1.6), +('ISL','English',0.0), +('ISR','Arabic',18.0), +('ITA','Sardinian',2.7), +('TMP','Portuguese',0.0), +('AUT','Serbo-Croatian',2.2), +('JAM','Hindi',1.9), +('JPN','Korean',0.5), +('YEM','Soqutri',0.0), +('JOR','Circassian',1.0), +('CXR','English',0.0), +('YUG','Albaniana',16.5), +('KHM','Vietnamese',5.5), +('CMR','Bamileke-bamum',18.6), +('CAN','French',23.4), +('CPV','Portuguese',0.0), +('KAZ','Russian',34.7), +('KEN','Luhya',13.8), +('CAF','Banda',23.5), +('CHN','Zhuang',1.4), +('KGZ','Russian',16.2), +('KIR','Tuvalu',0.5), +('COL','Chibcha',0.4), +('COM','Comorian-French',12.9), +('COG','Teke',17.3), +('COD','Kongo',16.0), +('CCK','English',0.0), +('PRK','Chinese',0.1), +('KOR','Chinese',0.1), +('GRC','Turkish',0.9), +('HRV','Slovene',0.0), +('KWT','English',0.0), +('CYP','Turkish',22.4), +('LAO','Mon-khmer',16.5), +('LVA','Russian',32.5), +('LSO','Zulu',15.0), +('LBN','Armenian',5.9), +('LBR','Bassa',13.7), +('LBY','Berberi',1.0), +('LIE','Italian',2.5), +('LTU','Russian',8.1), +('LUX','Portuguese',13.0), +('MAC','Portuguese',2.3), +('MDG','French',0.0), +('MKD','Albaniana',22.9), +('MWI','Lomwe',18.4), +('MDV','English',0.0), +('MYS','Chinese',9.0), +('MLI','Ful',13.9), +('MLT','English',2.1), +('MAR','Berberi',33.0), +('MHL','English',0.0), +('MTQ','French',0.0), +('MRT','Wolof',6.6), +('MUS','Bhojpuri',21.1), +('MYT','French',20.3), +('MEX','Náhuatl',1.8), +('FSM','Pohnpei',23.8), +('MDA','Russian',23.2), +('MCO','Monegasque',16.1), +('MNG','Kazakh',5.9), +('MOZ','Tsonga',12.4), +('MMR','Shan',8.5), +('NAM','Nama',12.4), +('NRU','Kiribati',17.9), +('NPL','Maithili',11.9), +('NIC','Miskito',1.6), +('NER','Songhai-zerma',21.2), +('NGA','Hausa',21.1), +('NIU','English',0.0), +('NOR','English',0.5), +('CIV','Gur',11.7), +('OMN','Balochi',0.0), +('PAK','Pashto',13.1), +('PLW','Philippene Languages',9.2), +('PAN','Creole English',14.0), +('PNG','Malenasian Languages',20.0), +('PRY','Guaraní',40.1), +('PER','Ketua',16.4), +('MNP','Chamorro',30.0), +('PRI','English',47.4), +('POL','German',1.3), +('GNQ','Bubi',8.7), +('QAT','Urdu',0.0), +('FRA','Arabic',2.5), +('GUF','Indian Languages',1.9), +('PYF','French',40.8), +('REU','Chinese',2.8), +('ROM','Hungarian',7.2), +('RWA','French',0.0), +('SWE','Finnish',2.4), +('KNA','English',0.0), +('LCA','English',20.0), +('VCT','English',0.0), +('DEU','Turkish',2.6), +('SLB','Papuan Languages',8.6), +('ZMB','Tongan',11.0), +('WSM','Samoan',47.5), +('STP','French',0.7), +('SEN','Ful',21.7); +INSERT INTO CountryLanguage VALUES +('SYC','English',3.8), +('SLE','Temne',31.8), +('SGP','Malay',14.1), +('SVK','Hungarian',10.5), +('SVN','Serbo-Croatian',7.9), +('SOM','Arabic',0.0), +('LKA','Tamil',19.6), +('SDN','Dinka',11.5), +('FIN','Swedish',5.7), +('SUR','Hindi',0.0), +('SWZ','Zulu',2.0), +('CHE','French',19.2), +('SYR','Kurdish',9.0), +('TJK','Uzbek',23.2), +('TWN','Mandarin Chinese',20.1), +('TZA','Swahili',8.8), +('DNK','Turkish',0.8), +('THA','Lao',26.9), +('TGO','Kabyé',13.8), +('TKL','English',0.0), +('TON','English',0.0), +('TTO','Hindi',3.4), +('TCD','Arabic',12.3), +('CZE','Moravian',12.9), +('TUN','Arabic-French',26.3), +('TUR','Kurdish',10.6), +('TKM','Uzbek',9.2), +('TUV','Kiribati',7.5), +('UGA','Nkole',10.7), +('UKR','Russian',32.9), +('HUN','Romani',0.5), +('NCL','French',34.3), +('NZL','Maori',4.3), +('UZB','Russian',10.9), +('BLR','Russian',32.0), +('WLF','Futuna',0.0), +('VUT','English',28.3), +('VEN','Goajiro',0.4), +('RUS','Tatar',3.2), +('VNM','Tho',1.8), +('EST','Russian',27.8), +('USA','Spanish',7.5), +('VIR','Spanish',13.3), +('ZWE','Ndebele',16.2), +('PSE','Hebrew',4.1), +('AFG','Uzbek',8.8), +('NLD','Arabic',0.9), +('ANT','Dutch',0.0), +('ALB','Macedonian',0.1), +('ASM','Tongan',3.1), +('AND','Portuguese',10.8), +('AGO','Kongo',13.2), +('ARG','Indian Languages',0.3), +('ABW','Spanish',7.4), +('AUS','Greek',1.6), +('AZE','Lezgian',2.3), +('BGD','Marma',0.2), +('BEL','Italian',2.4), +('BLZ','Maya Languages',9.6), +('BEN','Adja',11.1), +('BTN','Asami',15.2), +('BOL','Aimará',3.2), +('BWA','San',3.5), +('BRA','Italian',0.4), +('GBR','Gaeli',0.1), +('BRN','Chinese',9.3), +('BGR','Romani',3.7), +('BFA','Gurma',5.7), +('BDI','Swahili',0.0), +('CHL','Aimará',0.5), +('CRI','Chibcha',0.3), +('DJI','Arabic',10.6), +('ERI','Afar',4.3), +('ESP','Galecian',6.4), +('ZAF','Afrikaans',14.3), +('ETH','Tigrinja',7.2), +('PHL','Ilocano',9.3), +('GAB','Mpongwe',14.6), +('GMB','Wolof',12.6), +('GEO','Armenian',6.8), +('GHA','Ewe',11.9), +('GUM','Philippene Languages',19.7), +('GTM','Cakchiquel',8.9), +('GIN','Susu',11.0), +('GNB','Balante',14.6), +('GUY','Arawakan',1.4), +('HND','Creole English',0.2), +('HKG','Fukien',1.9), +('IDN','Malay',12.1), +('IND','Telugu',7.8), +('IRQ','Azerbaijani',1.7), +('IRN','Kurdish',9.1), +('ISR','Russian',8.9), +('ITA','Friuli',1.2), +('AUT','Turkish',1.5), +('JPN','Chinese',0.2), +('JOR','Armenian',1.0), +('YUG','Hungarian',3.4), +('KHM','Chinese',3.1), +('CMR','Duala',10.9), +('CAN','Chinese',2.5), +('KAZ','Ukrainian',5.0), +('KEN','Luo',12.8), +('CAF','Mandjia',14.8), +('CHN','Mantu',0.9), +('KGZ','Uzbek',14.1), +('COL','Creole English',0.1), +('COM','Comorian-madagassi',5.5), +('COG','Mboshi',11.4), +('COD','Mongo',13.5), +('LAO','Thai',7.8), +('LVA','Belorussian',4.1), +('LSO','English',0.0), +('LBN','French',0.0), +('LBR','Grebo',8.9), +('LIE','Turkish',2.5), +('LTU','Polish',7.0), +('LUX','Italian',4.6), +('MAC','Mandarin Chinese',1.2), +('MKD','Turkish',4.0), +('MWI','Yao',13.2), +('MYS','Tamil',3.9), +('MLI','Senufo and Minianka',12.0), +('MRT','Tukulor',5.4), +('MUS','French',3.4), +('MYT','Malagasy',16.1), +('MEX','Yucatec',1.1), +('FSM','Mortlock',7.6), +('MDA','Ukrainian',8.6), +('MCO','Italian',16.1), +('MNG','Dorbet',2.7), +('MOZ','Sena',9.4), +('MMR','Karen',6.2), +('NAM','Kavango',9.7), +('NRU','Chinese',8.5), +('NPL','Bhojpuri',7.5), +('NIC','Creole English',0.5), +('NER','Tamashek',10.4), +('NGA','Ibo',18.1), +('NOR','Danish',0.4), +('CIV','Malinke',11.4), +('PAK','Sindhi',11.8), +('PLW','English',3.2), +('PAN','Guaymí',5.3), +('PRY','Portuguese',3.2), +('PER','Aimará',2.3), +('MNP','Chinese',7.1), +('POL','Ukrainian',0.6), +('FRA','Portuguese',1.2), +('PYF','Chinese',2.9), +('REU','Comorian',2.8), +('ROM','Romani',0.7), +('SWE','Southern Slavic Languages',1.3), +('DEU','Southern Slavic Languages',1.4), +('SLB','Polynesian Languages',3.8), +('ZMB','Nyanja',7.8), +('WSM','English',0.6), +('SEN','Serer',12.5), +('SYC','French',1.3), +('SLE','Limba',8.3), +('SGP','Tamil',7.4), +('SVK','Romani',1.7), +('SVN','Hungarian',0.5), +('LKA','Mixed Languages',19.6), +('SDN','Nubian Languages',8.1), +('FIN','Russian',0.4), +('CHE','Italian',7.7), +('TJK','Russian',9.7), +('TWN','Hakka',11.0), +('TZA','Hehet',6.9), +('DNK','Arabic',0.7), +('THA','Chinese',12.1), +('TGO','Watyi',10.3), +('TTO','Creole English',2.9), +('TCD','Mayo-kebbi',11.5), +('CZE','Slovak',3.1), +('TUN','Arabic-French-English',3.2), +('TUR','Arabic',1.4), +('TKM','Russian',6.7), +('TUV','English',0.0), +('UGA','Kiga',8.3), +('UKR','Romanian',0.7), +('HUN','German',0.4), +('NCL','Polynesian Languages',11.6), +('UZB','Tadzhik',4.4), +('BLR','Ukrainian',1.3), +('VUT','French',14.2), +('VEN','Warrau',0.1), +('RUS','Ukrainian',1.3), +('VNM','Thai',1.6), +('EST','Ukrainian',2.8), +('USA','French',0.7), +('VIR','French',2.5), +('ZWE','English',2.2), +('AFG','Turkmenian',1.9), +('NLD','Turkish',0.8), +('AND','French',6.2), +('AGO','Luimbe-nganguela',5.4), +('ABW','Dutch',5.3), +('AUS','Canton Chinese',1.1); +INSERT INTO CountryLanguage VALUES +('AZE','Armenian',2.0), +('BGD','Garo',0.1), +('BEL','Arabic',1.6), +('BLZ','Garifuna',6.8), +('BEN','Aizo',8.7), +('BOL','Guaraní',0.1), +('BWA','Khoekhoe',2.5), +('BRA','Japanese',0.4), +('BRN','English',3.1), +('BGR','Macedonian',2.6), +('BFA','Busansi',3.5), +('CHL','Rapa nui',0.2), +('CRI','Chinese',0.2), +('ERI','Hadareb',3.8), +('ESP','Basque',1.6), +('ZAF','Northsotho',9.1), +('ETH','Gurage',4.7), +('PHL','Hiligaynon',9.1), +('GAB','Mbete',13.8), +('GMB','Diola',9.2), +('GEO','Azerbaijani',5.5), +('GHA','Ga-adangme',7.8), +('GUM','Korean',3.3), +('GTM','Kekchí',4.9), +('GIN','Kissi',6.0), +('GNB','Portuguese',8.1), +('HND','Miskito',0.2), +('HKG','Hakka',1.6), +('IDN','Madura',4.3), +('IND','Marathi',7.4), +('IRQ','Assyrian',0.8), +('IRN','Gilaki',5.3), +('ITA','French',0.5), +('AUT','Hungarian',0.4), +('JPN','English',0.1), +('YUG','Romani',1.4), +('KHM','Tam',2.4), +('CMR','Ful',9.6), +('CAN','Italian',1.7), +('KAZ','German',3.1), +('KEN','Kamba',11.2), +('CAF','Ngbaka',7.5), +('CHN','Hui',0.8), +('KGZ','Ukrainian',1.7), +('COL','Arawakan',0.1), +('COM','Comorian-Arabic',1.6), +('COG','Mbete',4.8), +('COD','Rwanda',10.3), +('LAO','Lao-Soung',5.2), +('LVA','Ukrainian',2.9), +('LBR','Gio',7.9), +('LTU','Belorussian',1.4), +('LUX','French',4.2), +('MAC','English',0.5), +('MKD','Romani',2.3), +('MWI','Ngoni',6.7), +('MYS','Iban',2.8), +('MLI','Soninke',8.7), +('MRT','Soninke',2.7), +('MUS','Hindi',1.2), +('MEX','Zapotec',0.6), +('FSM','Kosrean',7.3), +('MDA','Gagauzi',3.2), +('MCO','English',6.5), +('MNG','Bajad',1.9), +('MOZ','Lomwe',7.8), +('MMR','Rakhine',4.5), +('NAM','Afrikaans',9.5), +('NRU','Tuvalu',8.5), +('NPL','Tharu',5.4), +('NIC','Sumo',0.2), +('NER','Ful',9.7), +('NGA','Ful',11.3), +('NOR','Swedish',0.3), +('CIV','Kru',10.5), +('PAK','Saraiki',9.8), +('PLW','Chinese',1.6), +('PAN','Cuna',2.0), +('PRY','German',0.9), +('MNP','Korean',6.5), +('POL','Belorussian',0.5), +('FRA','Italian',0.4), +('REU','Malagasy',1.4), +('ROM','German',0.4), +('SWE','Arabic',0.8), +('DEU','Italian',0.7), +('ZMB','Lozi',6.4), +('SEN','Diola',5.0), +('SLE','Kono-vai',5.1), +('SVK','Czech and Moravian',1.1), +('SDN','Beja',6.4), +('FIN','Estonian',0.2), +('CHE','Romansh',0.6), +('TWN','Ami',0.6), +('TZA','Haya',5.9), +('DNK','German',0.5), +('THA','Malay',3.6), +('TGO','Kotokoli',5.7), +('TCD','Kanem-bornu',9.0), +('CZE','Polish',0.6), +('TKM','Kazakh',2.0), +('UGA','Soga',8.2), +('UKR','Bulgariana',0.3), +('HUN','Serbo-Croatian',0.2), +('UZB','Kazakh',3.8), +('BLR','Polish',0.6), +('RUS','Chuvash',0.9), +('VNM','Muong',1.5), +('EST','Belorussian',1.4), +('USA','German',0.7), +('ZWE','Nyanja',2.2), +('AFG','Balochi',0.9), +('AGO','Nyaneka-nkhumbi',5.4), +('AUS','Arabic',1.0), +('BGD','Khasi',0.1), +('BEL','German',1.0), +('BEN','Bariba',8.7), +('BWA','Ndebele',1.3), +('BRA','Indian Languages',0.2), +('BFA','Dagara',3.1), +('ERI','Bilin',3.0), +('ZAF','English',8.5), +('ETH','Somali',4.1), +('PHL','Bicol',5.7), +('GMB','Soninke',7.6), +('GEO','Osseetti',2.4), +('GHA','Gurma',3.3), +('GUM','Japanese',2.0), +('GTM','Mam',2.7), +('GIN','Kpelle',4.6), +('GNB','Malinke',6.9), +('HKG','Chiu chau',1.4), +('IDN','Minangkabau',2.4), +('IND','Tamil',6.3), +('IRQ','Persian',0.8), +('IRN','Luri',4.3), +('ITA','German',0.5), +('AUT','Slovene',0.4), +('JPN','Philippene Languages',0.1), +('YUG','Slovak',0.7), +('CMR','Tikar',7.4), +('CAN','German',1.6), +('KAZ','Uzbek',2.3), +('KEN','Kalenjin',10.8), +('CAF','Sara',6.4), +('CHN','Miao',0.7), +('KGZ','Tatar',1.3), +('COL','Caribbean',0.1), +('COM','Comorian-Swahili',0.5), +('COG','Punu',2.9), +('COD','Zande',6.1), +('LVA','Polish',2.1), +('LBR','Kru',7.2), +('LTU','Ukrainian',1.1), +('LUX','German',2.3), +('MKD','Serbo-Croatian',2.0), +('MYS','English',1.6), +('MLI','Tamashek',7.3), +('MRT','Ful',1.2), +('MUS','Tamil',0.8), +('MEX','Mixtec',0.6), +('FSM','Yap',5.8), +('MDA','Bulgariana',1.6), +('MNG','Buryat',1.7), +('MOZ','Shona',6.5), +('MMR','Mon',2.4), +('NAM','Herero',8.0), +('NRU','English',7.5), +('NPL','Tamang',4.9), +('NER','Kanuri',4.4), +('NGA','Ibibio',5.6), +('NOR','Saame',0.0), +('CIV','[South]Mande',7.7), +('PAK','Urdu',7.6), +('PAN','Embera',0.6), +('MNP','English',4.8), +('FRA','Spanish',0.4), +('REU','Tamil',0.0), +('ROM','Ukrainian',0.3), +('SWE','Spanish',0.6), +('DEU','Greek',0.4), +('ZMB','Chewa',5.7), +('SEN','Malinke',3.8), +('SLE','Bullom-sherbro',3.8), +('SVK','Ukrainian and Russian',0.6), +('SDN','Nuer',4.9), +('FIN','Saame',0.0), +('TWN','Atayal',0.4), +('TZA','Makonde',5.9), +('DNK','English',0.3), +('THA','Khmer',1.3), +('TGO','Ane',5.7), +('TCD','Ouaddai',8.7), +('CZE','German',0.5), +('UGA','Teso',6.0), +('UKR','Hungarian',0.3), +('HUN','Romanian',0.1), +('UZB','Karakalpak',2.0), +('RUS','Bashkir',0.7), +('VNM','Chinese',1.4); +INSERT INTO CountryLanguage VALUES +('EST','Finnish',0.7), +('USA','Italian',0.6), +('AGO','Chokwe',4.2), +('AUS','Vietnamese',0.8), +('BGD','Santhali',0.1), +('BEL','Turkish',0.9), +('BEN','Somba',6.7), +('BFA','Dyula',2.6), +('ERI','Saho',3.0), +('ZAF','Tswana',8.1), +('ETH','Sidamo',3.2), +('PHL','Waray-waray',3.8), +('GEO','Abhyasi',1.7), +('GHA','Joruba',1.3), +('GIN','Yalunka',2.9), +('GNB','Mandyako',4.9), +('IDN','Batakki',2.2), +('IND','Urdu',5.1), +('IRN','Mazandarani',3.6), +('ITA','Albaniana',0.2), +('AUT','Polish',0.2), +('JPN','Ainu',0.0), +('YUG','Macedonian',0.5), +('CMR','Mandara',5.7), +('CAN','Polish',0.7), +('KAZ','Tatar',2.0), +('KEN','Gusii',6.1), +('CAF','Mbum',6.4), +('CHN','Uighur',0.6), +('KGZ','Kazakh',0.8), +('COG','Sango',2.6), +('COD','Ngala and Bangi',5.8), +('LVA','Lithuanian',1.2), +('LBR','Mano',7.2), +('MYS','Dusun',1.1), +('MLI','Songhai',6.9), +('MRT','Zenaga',1.2), +('MUS','Marathi',0.7), +('MEX','Otomí',0.4), +('FSM','Wolea',3.7), +('MNG','Dariganga',1.4), +('MOZ','Tswa',6.0), +('MMR','Chin',2.2), +('NAM','Caprivi',4.7), +('NPL','Newari',3.7), +('NGA','Kanuri',4.1), +('PAK','Balochi',3.0), +('PAN','Arabic',0.6), +('MNP','Carolinian',4.8), +('FRA','Turkish',0.4), +('ROM','Serbo-Croatian',0.1), +('SWE','Norwegian',0.5), +('DEU','Polish',0.3), +('ZMB','Nsenga',4.3), +('SEN','Soninke',1.3), +('SLE','Ful',3.8), +('SDN','Zande',2.7), +('TWN','Paiwan',0.3), +('TZA','Nyakusa',5.4), +('DNK','Swedish',0.3), +('THA','Kuy',1.1), +('TGO','Moba',5.4), +('TCD','Hadjarai',6.7), +('CZE','Silesiana',0.4), +('UGA','Lango',5.9), +('UKR','Belorussian',0.3), +('HUN','Slovak',0.1), +('UZB','Tatar',1.8), +('RUS','Chechen',0.6), +('VNM','Khmer',1.4), +('USA','Chinese',0.6), +('AGO','Luvale',3.6), +('AUS','Serbo-Croatian',0.6), +('BGD','Tripuri',0.1), +('BEN','Ful',5.6), +('ZAF','Southsotho',7.6), +('ETH','Walaita',2.8), +('PHL','Pampango',3.0), +('GIN','Loma',2.3), +('IDN','Bugi',2.2), +('IND','Gujarati',4.8), +('IRN','Balochi',2.3), +('ITA','Slovene',0.2), +('AUT','Czech',0.2), +('CMR','Maka',4.9), +('CAN','Spanish',0.7), +('KEN','Meru',5.5), +('CHN','Yi',0.6), +('KGZ','Tadzhik',0.8), +('COD','Rundi',3.8), +('LBR','Loma',5.8), +('MOZ','Chuabo',5.7), +('MMR','Kachin',1.4), +('NAM','San',1.9), +('NPL','Hindi',3.0), +('NGA','Edo',3.3), +('PAK','Hindko',2.4), +('SLE','Kuranko',3.4), +('SDN','Bari',2.5), +('TZA','Chaga and Pare',4.9), +('DNK','Norwegian',0.3), +('TGO','Naudemba',4.1), +('TCD','Tandjile',6.5), +('CZE','Romani',0.3), +('UGA','Lugbara',4.7), +('UKR','Polish',0.1), +('RUS','Mordva',0.5), +('VNM','Nung',1.1), +('USA','Tagalog',0.4), +('AGO','Ambo',2.4), +('AUS','German',0.6), +('ZAF','Tsonga',4.3), +('PHL','Pangasinan',1.8), +('IDN','Banja',1.8), +('IND','Kannada',3.9), +('IRN','Arabic',2.2), +('ITA','Romani',0.2), +('AUT','Romanian',0.2), +('CMR','Masana',3.9), +('CAN','Portuguese',0.7), +('KEN','Nyika',4.8), +('CHN','Tujia',0.5), +('COD','Teke',2.7), +('LBR','Malinke',5.1), +('MOZ','Ronga',3.7), +('MMR','Kayah',0.4), +('NAM','German',0.9), +('NGA','Tiv',2.3), +('PAK','Brahui',1.2), +('SLE','Yalunka',3.4), +('SDN','Fur',2.1), +('TZA','Luguru',4.9), +('TGO','Gurma',3.4), +('TCD','Gorane',6.2), +('CZE','Hungarian',0.2), +('UGA','Gisu',4.5), +('RUS','Kazakh',0.4), +('VNM','Miao',0.9), +('USA','Polish',0.3), +('AGO','Luchazi',2.4), +('ZAF','Swazi',2.5), +('PHL','Maguindanao',1.4), +('IDN','Bali',1.7), +('IND','Malajalam',3.6), +('IRN','Bakhtyari',1.7), +('CAN','Punjabi',0.7), +('KEN','Masai',1.6), +('CHN','Mongolian',0.4), +('COD','Boa',2.3), +('MOZ','Marendje',3.5), +('NGA','Ijo',1.8), +('SDN','Chilluk',1.7), +('TZA','Shambala',4.3), +('UGA','Acholi',4.4), +('RUS','Avarian',0.4), +('VNM','Man',0.7), +('USA','Korean',0.3), +('ZAF','Venda',2.2), +('PHL','Maranao',1.3), +('IND','Orija',3.3), +('IRN','Turkmenian',1.6), +('CAN','Ukrainian',0.6), +('KEN','Turkana',1.4), +('CHN','Tibetan',0.4), +('COD','Chokwe',1.8), +('MOZ','Nyanja',3.3), +('NGA','Bura',1.6), +('SDN','Lotuko',1.5), +('TZA','Gogo',3.9), +('UGA','Rwanda',3.2), +('RUS','Mari',0.4), +('USA','Vietnamese',0.2), +('ZAF','Ndebele',1.5), +('IND','Punjabi',2.8), +('CAN','Dutch',0.5), +('CHN','Puyi',0.2), +('TZA','Ha',3.5), +('RUS','Udmur',0.3), +('USA','Japanese',0.2), +('IND','Asami',1.5), +('CAN','Eskimo Languages',0.1), +('CHN','Dong',0.2), +('RUS','Belorussian',0.3), +('USA','Portuguese',0.2); + +ANALYZE TABLE Country, City, CountryLanguage; === added file 'mysql-test/include/world_schema.inc' --- a/mysql-test/include/world_schema.inc 1970-01-01 00:00:00 +0000 +++ b/mysql-test/include/world_schema.inc 2009-10-12 04:59:34 +0000 @@ -0,0 +1,25 @@ +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) +); === modified file 'mysql-test/r/index_merge_myisam.result' --- a/mysql-test/r/index_merge_myisam.result 2009-06-15 14:36:51 +0000 +++ b/mysql-test/r/index_merge_myisam.result 2009-10-12 04:59:34 +0000 @@ -115,11 +115,11 @@ id select_type table type possible_keys explain select * from t0 where (key1 < 3 or key2 < 3) and (key3 < 100); id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t0 range i1,i2,i3 i3 4 NULL 95 Using where +1 SIMPLE t0 index_merge i1,i2,i3 i1,i2 4,4 NULL 6 Using sort_union(i1,i2); Using where explain select * from t0 where (key1 < 3 or key2 < 3) and (key3 < 1000); id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t0 ALL i1,i2,i3 NULL NULL NULL 1024 Using where +1 SIMPLE t0 index_merge i1,i2,i3 i1,i2 4,4 NULL 6 Using sort_union(i1,i2); Using where explain select * from t0 where ((key1 < 4 or key2 < 4) and (key2 <5 or key3 < 4)) or @@ -259,7 +259,7 @@ explain select * from t0,t1 where (t0.key1=t1.key1) and (t0.key1=3 or t0.key2=4) and t1.key1<200; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t0 ALL i1,i2 NULL NULL NULL 1024 Using where +1 SIMPLE t0 index_merge i1,i2 i1,i2 4,4 NULL 2 Using union(i1,i2); Using where 1 SIMPLE t1 ref i1 i1 4 test.t0.key1 1 explain select * from t0,t1 where (t0.key1=t1.key1) and === added file 'mysql-test/r/range_vs_index_merge.result' --- a/mysql-test/r/range_vs_index_merge.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/r/range_vs_index_merge.result 2009-10-12 04:59:34 +0000 @@ -0,0 +1,1328 @@ +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); +EXPLAIN +SELECT * FROM City +WHERE (Population >= 100000 OR Name LIKE 'P%' OR Population < 100000); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City ALL Population,Name NULL NULL NULL 4079 Using where +EXPLAIN +SELECT * FROM City +WHERE (Population >= 100000 OR Name LIKE 'P%') AND Country='CAN' OR +(Population < 100000 OR Name Like 'T%') AND Country='ARG'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Population,Country,Name Country 3 NULL 104 Using where +EXPLAIN +SELECT * FROM City +WHERE Population < 200000 AND Name LIKE 'P%' AND +(Population > 300000 OR Name LIKE 'T%') AND +(Population < 100000 OR Name LIKE 'Pa%'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Population,Name Name 35 NULL 135 Using where +EXPLAIN +SELECT * FROM City +WHERE Population > 100000 AND Name LIKE 'Aba%' OR +Country IN ('CAN', 'ARG') AND ID < 3800 OR +Country < 'U' AND Name LIKE 'Zhu%' OR +ID BETWEEN 3800 AND 3810; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City index_merge PRIMARY,Population,Country,Name Name,Country,PRIMARY 35,3,4 NULL 132 Using sort_union(Name,Country,PRIMARY); Using where +EXPLAIN +SELECT * FROM City +WHERE (Population > 101000 AND Population < 115000); +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); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Population Population 4 NULL 81 Using where +EXPLAIN +SELECT * FROM City +WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F')); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City index_merge Country,Name Name,Country 35,3 NULL 172 Using sort_union(Name,Country); Using where +EXPLAIN +SELECT * FROM City +WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F')) +AND (Population > 101000 AND Population < 115000); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City index_merge Population,Country,Name Name,Country 35,3 NULL 172 Using sort_union(Name,Country); Using where +EXPLAIN +SELECT * FROM City +WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F')) +AND (Population > 101000 AND Population < 103000); +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 +SELECT * FROM City USE INDEX () +WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F')) +AND (Population > 101000 AND Population < 115000); +ID Name Country Population +403 Catanduva BRA 107761 +412 Cachoeirinha BRA 103240 +636 Bilbays EGY 113608 +637 Mit Ghamr EGY 101801 +701 Tarragona ESP 113016 +702 Lleida (Lérida) ESP 112207 +703 Jaén ESP 109247 +704 Ourense (Orense) ESP 109120 +705 Mataró ESP 104095 +706 Algeciras ESP 103106 +707 Marbella ESP 101144 +759 Gonder ETH 112249 +869 Cabuyao PHL 106630 +870 Calapan PHL 105910 +873 Cauayan PHL 103952 +1844 Cape Breton CAN 114733 +1847 Cambridge CAN 109186 +2908 Cajamarca PER 108009 +3003 Caen FRA 113987 +3411 Ceyhan TUR 102412 +3571 Calabozo VEN 107146 +3786 Cam Ranh VNM 114041 +3792 Tartu EST 101246 +4002 Carrollton USA 109576 +4027 Cape Coral USA 102286 +4032 Cambridge USA 101355 +SELECT * FROM City +WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F')) +AND (Population > 101000 AND Population < 115000); +ID Name Country Population +403 Catanduva BRA 107761 +412 Cachoeirinha BRA 103240 +636 Bilbays EGY 113608 +637 Mit Ghamr EGY 101801 +701 Tarragona ESP 113016 +702 Lleida (Lérida) ESP 112207 +703 Jaén ESP 109247 +704 Ourense (Orense) ESP 109120 +705 Mataró ESP 104095 +706 Algeciras ESP 103106 +707 Marbella ESP 101144 +759 Gonder ETH 112249 +869 Cabuyao PHL 106630 +870 Calapan PHL 105910 +873 Cauayan PHL 103952 +1844 Cape Breton CAN 114733 +1847 Cambridge CAN 109186 +2908 Cajamarca PER 108009 +3003 Caen FRA 113987 +3411 Ceyhan TUR 102412 +3571 Calabozo VEN 107146 +3786 Cam Ranh VNM 114041 +3792 Tartu EST 101246 +4002 Carrollton USA 109576 +4027 Cape Coral USA 102286 +4032 Cambridge USA 101355 +SELECT * FROM City USE INDEX () +WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F')) +AND (Population > 101000 AND Population < 103000); +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); +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 +1 SIMPLE City range Name Name 35 NULL 13 Using where +EXPLAIN +SELECT * FROM City WHERE (Name < 'C'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Name Name 35 NULL 325 Using where +EXPLAIN +SELECT * FROM City WHERE (Country > 'A' AND Country < 'B'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Country Country 3 NULL 104 Using where +EXPLAIN +SELECT * FROM City WHERE (Name BETWEEN 'P' AND 'Pb'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Name Name 35 NULL 39 Using where +EXPLAIN +SELECT * FROM City WHERE (Name BETWEEN 'P' AND 'T'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Name Name 35 NULL 468 Using where +EXPLAIN +SELECT * FROM City WHERE (Population > 101000 AND Population < 110000); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Population Population 4 NULL 328 Using where +EXPLAIN +SELECT * FROM City WHERE (Population > 103000 AND Population < 104000); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Population Population 4 NULL 37 Using where +EXPLAIN +SELECT * FROM City +WHERE (Name < 'Ac' AND (Country > 'A' AND Country < 'B')) OR +(Name BETWEEN 'P' AND 'Pb' AND (Population > 101000 AND Population < 110000)); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Population,Country,Name Name 35 NULL 52 Using where +EXPLAIN +SELECT * FROM City +WHERE (Name < 'Ac' AND (Country > 'A' AND Country < 'B')) OR +(Name BETWEEN 'P' AND 'T' AND (Population > 103000 AND Population < 104000)); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City index_merge Population,Country,Name Name,Population 35,4 NULL 50 Using sort_union(Name,Population); Using where +EXPLAIN +SELECT * FROM City +WHERE (Name < 'C' AND (Country > 'A' AND Country < 'B')) OR +(Name BETWEEN 'P' AND 'Pb' AND (Population > 101000 AND Population < 110000)); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City index_merge Population,Country,Name Country,Name 3,35 NULL 143 Using sort_union(Country,Name); Using where +EXPLAIN +SELECT * FROM City +WHERE (Name < 'C' AND (Country > 'A' AND Country < 'B')) OR +(Name BETWEEN 'P' AND 'T' AND (Population > 103000 AND Population < 104000)); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City index_merge Population,Country,Name Country,Population 3,4 NULL 141 Using sort_union(Country,Population); Using where +SELECT * FROM City USE INDEX () +WHERE (Name < 'Ac' AND (Country > 'A' AND Country < 'B')) OR +(Name BETWEEN 'P' AND 'Pb' AND (Population > 101000 AND Population < 110000)); +ID Name Country Population +65 Abu Dhabi ARE 398695 +168 Pabna BGD 103277 +189 Parakou BEN 103577 +750 Paarl ZAF 105768 +2865 Pak Pattan PAK 107800 +SELECT * FROM City +WHERE (Name < 'Ac' AND (Country > 'A' AND Country < 'B')) OR +(Name BETWEEN 'P' AND 'Pb' AND (Population > 101000 AND Population < 110000)); +ID Name Country Population +65 Abu Dhabi ARE 398695 +750 Paarl ZAF 105768 +168 Pabna BGD 103277 +2865 Pak Pattan PAK 107800 +189 Parakou BEN 103577 +SELECT * FROM City USE INDEX () +WHERE (Name < 'Ac' AND (Country > 'A' AND Country < 'B')) OR +(Name BETWEEN 'P' AND 'T' AND (Population > 103000 AND Population < 104000)); +ID Name Country Population +65 Abu Dhabi ARE 398695 +168 Pabna BGD 103277 +189 Parakou BEN 103577 +914 Sekondi-Takoradi GHA 103653 +1003 Pemalang IDN 103500 +2663 Río Bravo MEX 103901 +SELECT * FROM City +WHERE (Name < 'Ac' AND (Country > 'A' AND Country < 'B')) OR +(Name BETWEEN 'P' AND 'T' AND (Population > 103000 AND Population < 104000)); +ID Name Country Population +65 Abu Dhabi ARE 398695 +168 Pabna BGD 103277 +189 Parakou BEN 103577 +914 Sekondi-Takoradi GHA 103653 +1003 Pemalang IDN 103500 +2663 Río Bravo MEX 103901 +SELECT * FROM City USE INDEX () +WHERE (Name < 'C' AND (Country > 'A' AND Country < 'B')) OR +(Name BETWEEN 'P' AND 'Pb' AND (Population > 101000 AND Population < 110000)); +ID Name Country Population +55 Andorra la Vella AND 21189 +59 Benguela AGO 128300 +65 Abu Dhabi ARE 398695 +67 al-Ayn ARE 225970 +68 Ajman ARE 114395 +69 Buenos Aires ARG 2982146 +75 Almirante Brown ARG 538918 +85 Avellaneda ARG 353046 +93 Berazategui ARG 276916 +96 Bahía Blanca ARG 239810 +132 Brisbane AUS 1291117 +134 Adelaide AUS 978100 +144 Baku AZE 1787800 +168 Pabna BGD 103277 +189 Parakou BEN 103577 +750 Paarl ZAF 105768 +2865 Pak Pattan PAK 107800 +SELECT * FROM City +WHERE (Name < 'C' AND (Country > 'A' AND Country < 'B')) OR +(Name BETWEEN 'P' AND 'Pb' AND (Population > 101000 AND Population < 110000)); +ID Name Country Population +55 Andorra la Vella AND 21189 +59 Benguela AGO 128300 +65 Abu Dhabi ARE 398695 +67 al-Ayn ARE 225970 +68 Ajman ARE 114395 +69 Buenos Aires ARG 2982146 +75 Almirante Brown ARG 538918 +85 Avellaneda ARG 353046 +93 Berazategui ARG 276916 +96 Bahía Blanca ARG 239810 +132 Brisbane AUS 1291117 +134 Adelaide AUS 978100 +144 Baku AZE 1787800 +168 Pabna BGD 103277 +189 Parakou BEN 103577 +750 Paarl ZAF 105768 +2865 Pak Pattan PAK 107800 +SELECT * FROM City USE INDEX () +WHERE (Name < 'C' AND (Country > 'A' AND Country < 'B')) OR +(Name BETWEEN 'P' AND 'T' AND (Population > 103000 AND Population < 104000)); +ID Name Country Population +55 Andorra la Vella AND 21189 +59 Benguela AGO 128300 +65 Abu Dhabi ARE 398695 +67 al-Ayn ARE 225970 +68 Ajman ARE 114395 +69 Buenos Aires ARG 2982146 +75 Almirante Brown ARG 538918 +85 Avellaneda ARG 353046 +93 Berazategui ARG 276916 +96 Bahía Blanca ARG 239810 +132 Brisbane AUS 1291117 +134 Adelaide AUS 978100 +144 Baku AZE 1787800 +168 Pabna BGD 103277 +189 Parakou BEN 103577 +914 Sekondi-Takoradi GHA 103653 +1003 Pemalang IDN 103500 +2663 Río Bravo MEX 103901 +SELECT * FROM City +WHERE (Name < 'C' AND (Country > 'A' AND Country < 'B')) OR +(Name BETWEEN 'P' AND 'T' AND (Population > 103000 AND Population < 104000)); +ID Name Country Population +55 Andorra la Vella AND 21189 +59 Benguela AGO 128300 +65 Abu Dhabi ARE 398695 +67 al-Ayn ARE 225970 +68 Ajman ARE 114395 +69 Buenos Aires ARG 2982146 +75 Almirante Brown ARG 538918 +85 Avellaneda ARG 353046 +93 Berazategui ARG 276916 +96 Bahía Blanca ARG 239810 +132 Brisbane AUS 1291117 +134 Adelaide AUS 978100 +144 Baku AZE 1787800 +168 Pabna BGD 103277 +189 Parakou BEN 103577 +914 Sekondi-Takoradi GHA 103653 +1003 Pemalang IDN 103500 +2663 Río Bravo MEX 103901 +EXPLAIN +SELECT * FROM City WHERE (ID < 50) OR (ID BETWEEN 100 AND 110); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range PRIMARY PRIMARY 4 NULL 61 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 +1 SIMPLE City range PRIMARY PRIMARY 4 NULL 501 Using where +EXPLAIN +SELECT * FROM City WHERE (ID < 600) OR (ID BETWEEN 900 AND 1800); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City ALL PRIMARY NULL NULL NULL 4079 Using where +EXPLAIN +SELECT * FROM City WHERE Country > 'A' AND Country < 'ARG'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Country Country 3 NULL 19 Using where +EXPLAIN +SELECT * FROM City WHERE Name LIKE 'H%' OR Name LIKE 'P%' ; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Name Name 35 NULL 222 Using where +EXPLAIN +SELECT * FROM City WHERE Name LIKE 'Ha%' OR Name LIKE 'Pa%' ; +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'))) +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 +EXPLAIN +SELECT * FROM City +WHERE ((ID < 800) AND (Name LIKE 'Ha%' OR (Country > 'A' AND Country < 'ARG'))) +OR ((ID BETWEEN 900 AND 1800) 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 index_merge PRIMARY,Population,Country,Name Name,Country,Population 35,3,4 NULL 128 Using sort_union(Name,Country,Population); Using where +EXPLAIN +SELECT * FROM City +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 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'))) +OR ((ID BETWEEN 100 AND 110) AND +(Name LIKE 'P%' OR (Population > 103000 AND Population < 104000))); +ID Name Country Population +1 Kabul AFG 1780000 +2 Qandahar AFG 237500 +3 Herat AFG 186800 +4 Mazar-e-Sharif AFG 127800 +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'))) +OR ((ID BETWEEN 100 AND 110) AND +(Name LIKE 'P%' OR (Population > 103000 AND Population < 104000))); +ID Name Country Population +1 Kabul AFG 1780000 +2 Qandahar AFG 237500 +3 Herat AFG 186800 +4 Mazar-e-Sharif AFG 127800 +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() +WHERE ((ID < 800) AND (Name LIKE 'Ha%' OR (Country > 'A' AND Country < 'ARG'))) +OR ((ID BETWEEN 900 AND 1800) AND +(Name LIKE 'Pa%' OR (Population > 103000 AND Population < 104000))); +ID Name Country Population +1 Kabul AFG 1780000 +2 Qandahar AFG 237500 +3 Herat AFG 186800 +4 Mazar-e-Sharif AFG 127800 +7 Haag NLD 440900 +16 Haarlem NLD 148772 +25 Haarlemmermeer NLD 110722 +33 Willemstad ANT 2345 +34 Tirana ALB 270000 +55 Andorra la Vella AND 21189 +56 Luanda AGO 2022000 +57 Huambo AGO 163100 +58 Lobito AGO 130000 +59 Benguela AGO 128300 +60 Namibe AGO 118200 +61 South Hill AIA 961 +62 The Valley AIA 595 +64 Dubai ARE 669181 +65 Abu Dhabi ARE 398695 +66 Sharja ARE 320095 +67 al-Ayn ARE 225970 +68 Ajman ARE 114395 +129 Oranjestad ABW 29034 +191 Hamilton BMU 1200 +528 Hartlepool GBR 92000 +529 Halifax GBR 91069 +914 Sekondi-Takoradi GHA 103653 +943 Palembang IDN 1222764 +950 Padang IDN 534474 +983 Palu IDN 142800 +984 Pasuruan IDN 134019 +991 Pangkal Pinang IDN 124000 +1003 Pemalang IDN 103500 +1004 Klaten IDN 103300 +1007 Palangka Raya IDN 99693 +1020 Padang Sidempuan IDN 91200 +1045 Patna IND 917243 +1114 Panihati IND 275990 +1129 Patiala IND 238368 +1142 Panipat IND 215218 +1159 Parbhani IND 190255 +1231 Pali IND 136842 +1263 Pathankot IND 123930 +1265 Palghat (Palakkad) IND 123289 +1293 Pallavaram IND 111866 +1319 Tellicherry (Thalassery) IND 103579 +1339 Palayankottai IND 97662 +1345 Patan IND 96109 +1436 Marv Dasht IRN 103579 +1468 Palermo ITA 683794 +1478 Padova ITA 211391 +1484 Parma ITA 168717 +1530 Kingston JAM 103962 +1747 Toda JPN 103969 +1748 Tajimi JPN 103171 +1785 Ibb YEM 103300 +SELECT * FROM City +WHERE ((ID < 800) AND (Name LIKE 'Ha%' OR (Country > 'A' AND Country < 'ARG'))) +OR ((ID BETWEEN 900 AND 1800) AND +(Name LIKE 'Pa%' OR (Population > 103000 AND Population < 104000))); +ID Name Country Population +1 Kabul AFG 1780000 +2 Qandahar AFG 237500 +3 Herat AFG 186800 +4 Mazar-e-Sharif AFG 127800 +7 Haag NLD 440900 +16 Haarlem NLD 148772 +25 Haarlemmermeer NLD 110722 +33 Willemstad ANT 2345 +34 Tirana ALB 270000 +55 Andorra la Vella AND 21189 +56 Luanda AGO 2022000 +57 Huambo AGO 163100 +58 Lobito AGO 130000 +59 Benguela AGO 128300 +60 Namibe AGO 118200 +61 South Hill AIA 961 +62 The Valley AIA 595 +64 Dubai ARE 669181 +65 Abu Dhabi ARE 398695 +66 Sharja ARE 320095 +67 al-Ayn ARE 225970 +68 Ajman ARE 114395 +129 Oranjestad ABW 29034 +191 Hamilton BMU 1200 +528 Hartlepool GBR 92000 +529 Halifax GBR 91069 +914 Sekondi-Takoradi GHA 103653 +943 Palembang IDN 1222764 +950 Padang IDN 534474 +983 Palu IDN 142800 +984 Pasuruan IDN 134019 +991 Pangkal Pinang IDN 124000 +1003 Pemalang IDN 103500 +1004 Klaten IDN 103300 +1007 Palangka Raya IDN 99693 +1020 Padang Sidempuan IDN 91200 +1045 Patna IND 917243 +1114 Panihati IND 275990 +1129 Patiala IND 238368 +1142 Panipat IND 215218 +1159 Parbhani IND 190255 +1231 Pali IND 136842 +1263 Pathankot IND 123930 +1265 Palghat (Palakkad) IND 123289 +1293 Pallavaram IND 111866 +1319 Tellicherry (Thalassery) IND 103579 +1339 Palayankottai IND 97662 +1345 Patan IND 96109 +1436 Marv Dasht IRN 103579 +1468 Palermo ITA 683794 +1478 Padova ITA 211391 +1484 Parma ITA 168717 +1530 Kingston JAM 103962 +1747 Toda JPN 103969 +1748 Tajimi JPN 103171 +1785 Ibb YEM 103300 +SELECT * FROM City USE INDEX () +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 +1 Kabul AFG 1780000 +2 Qandahar AFG 237500 +3 Herat AFG 186800 +4 Mazar-e-Sharif AFG 127800 +7 Haag NLD 440900 +16 Haarlem NLD 148772 +25 Haarlemmermeer NLD 110722 +33 Willemstad ANT 2345 +34 Tirana ALB 270000 +55 Andorra la Vella AND 21189 +56 Luanda AGO 2022000 +57 Huambo AGO 163100 +58 Lobito AGO 130000 +59 Benguela AGO 128300 +60 Namibe AGO 118200 +61 South Hill AIA 961 +62 The Valley AIA 595 +64 Dubai ARE 669181 +65 Abu Dhabi ARE 398695 +66 Sharja ARE 320095 +67 al-Ayn ARE 225970 +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 +SELECT * FROM City +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 +1 Kabul AFG 1780000 +2 Qandahar AFG 237500 +3 Herat AFG 186800 +4 Mazar-e-Sharif AFG 127800 +7 Haag NLD 440900 +16 Haarlem NLD 148772 +25 Haarlemmermeer NLD 110722 +33 Willemstad ANT 2345 +34 Tirana ALB 270000 +55 Andorra la Vella AND 21189 +56 Luanda AGO 2022000 +57 Huambo AGO 163100 +58 Lobito AGO 130000 +59 Benguela AGO 128300 +60 Namibe AGO 118200 +61 South Hill AIA 961 +62 The Valley AIA 595 +64 Dubai ARE 669181 +65 Abu Dhabi ARE 398695 +66 Sharja ARE 320095 +67 al-Ayn ARE 225970 +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 +1 SIMPLE City range Population Population 4 NULL 39 Using where +EXPLAIN +SELECT * FROM City WHERE Population > 101000 AND Population < 110000; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Population Population 4 NULL 328 Using where +EXPLAIN +SELECT * FROM City WHERE Country < 'C'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Country Country 3 NULL 436 Using where +EXPLAIN +SELECT * FROM City WHERE Country < 'AGO'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Country Country 3 NULL 6 Using where +EXPLAIN +SELECT * FROM City WHERE Name BETWEEN 'P' AND 'T'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Name Name 35 NULL 468 Using where +EXPLAIN +SELECT * FROM City WHERE Name BETWEEN 'P' AND 'Pb'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Name Name 35 NULL 39 Using where +EXPLAIN +SELECT * FROM City WHERE ID BETWEEN 3400 AND 3800; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range PRIMARY PRIMARY 4 NULL 401 Using where +EXPLAIN +SELECT * FROM City WHERE ID BETWEEN 3790 AND 3800; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range PRIMARY PRIMARY 4 NULL 11 Using where +EXPLAIN +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 < 102000) AND +(Country < 'C' OR Name BETWEEN 'P' AND 'T')) OR +((ID BETWEEN 3400 AND 3800) AND +(Country < 'AGO' OR Name LIKE 'Pa%')); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City index_merge PRIMARY,Population,Country,Name Country,Name,Population 3,35,4 NULL 84 Using sort_union(Country,Name,Population); Using where +EXPLAIN +SELECT * FROM City +WHERE ((Population > 101000 AND Population < 110000) AND +(Country < 'AGO' OR Name BETWEEN 'P' AND 'Pb')) OR +((ID BETWEEN 3790 AND 3800) AND +(Country < 'C' OR Name LIKE 'P%')); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City index_merge PRIMARY,Population,Country,Name Country,Name,PRIMARY 3,35,4 NULL 56 Using sort_union(Country,Name,PRIMARY); Using where +SELECT * FROM City USE INDEX () +WHERE ((Population > 101000 AND Population < 102000) AND +(Country < 'C' OR Name BETWEEN 'P' AND 'T')) OR +((ID BETWEEN 3400 AND 3800) AND +(Country < 'AGO' OR Name LIKE 'Pa%')); +ID Name Country Population +169 Naogaon BGD 101266 +205 Francistown BWA 101805 +417 Itaituba BRA 101320 +418 Araras BRA 101046 +751 Potchefstroom ZAF 101817 +1752 Sakata JPN 101651 +1851 Saint John´s CAN 101936 +1853 Saanich CAN 101388 +2909 Puno PER 101578 +3463 Pavlograd UKR 127000 +4030 Sandy USA 101853 +SELECT * FROM City +WHERE ((Population > 101000 AND Population < 102000) AND +(Country < 'C' OR Name BETWEEN 'P' AND 'T')) OR +((ID BETWEEN 3400 AND 3800) AND +(Country < 'AGO' OR Name LIKE 'Pa%')); +ID Name Country Population +169 Naogaon BGD 101266 +205 Francistown BWA 101805 +417 Itaituba BRA 101320 +418 Araras BRA 101046 +751 Potchefstroom ZAF 101817 +1752 Sakata JPN 101651 +1851 Saint John´s CAN 101936 +1853 Saanich CAN 101388 +2909 Puno PER 101578 +3463 Pavlograd UKR 127000 +4030 Sandy USA 101853 +SELECT * FROM City USE INDEX () +WHERE ((Population > 101000 AND Population < 110000) AND +(Country < 'AGO' OR Name BETWEEN 'P' AND 'Pb')) OR +((ID BETWEEN 3790 AND 3800) AND +(Country < 'C' OR Name LIKE 'P%')); +ID Name Country Population +168 Pabna BGD 103277 +189 Parakou BEN 103577 +750 Paarl ZAF 105768 +2865 Pak Pattan PAK 107800 +3797 Philadelphia USA 1517550 +3798 Phoenix USA 1321045 +SELECT * FROM City +WHERE ((Population > 101000 AND Population < 110000) AND +(Country < 'AGO' OR Name BETWEEN 'P' AND 'Pb')) OR +((ID BETWEEN 3790 AND 3800) AND +(Country < 'C' OR Name LIKE 'P%')); +ID Name Country Population +168 Pabna BGD 103277 +189 Parakou BEN 103577 +750 Paarl ZAF 105768 +2865 Pak Pattan PAK 107800 +3797 Philadelphia USA 1517550 +3798 Phoenix USA 1321045 +CREATE INDEX CountryPopulation ON City(Country,Population); +EXPLAIN +SELECT * FROM City WHERE Name LIKE 'Pas%'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Name Name 35 NULL 5 Using where +EXPLAIN +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); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Population Population 4 NULL 81 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%') +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 +EXPLAIN +SELECT * FROM City +WHERE ((Population > 101000 AND Population < 103000) OR Name LIKE 'P%') +AND Country='USA'; +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%') +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%') +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'; +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 +SELECT * FROM City USE INDEX () +WHERE ((Population > 101000 AND Population < 103000) OR Name LIKE 'P%') +AND Country='USA'; +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 +CREATE INDEX CountryName ON City(Country,Name); +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,CountryName Country 3 const 267 Using where +EXPLAIN +SELECT * FROM City WHERE Country='BRA'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City ref Country,CountryPopulation,CountryName CountryName 3 const 221 Using where +EXPLAIN +SELECT * FROM City WHERE ID BETWEEN 3790 AND 3800; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range PRIMARY PRIMARY 4 NULL 11 Using where +EXPLAIN +SELECT * FROM City WHERE ID BETWEEN 4025 AND 4035; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range PRIMARY PRIMARY 4 NULL 11 Using where +EXPLAIN +SELECT * FROM City WHERE ID BETWEEN 4028 AND 4032; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range PRIMARY PRIMARY 4 NULL 5 Using where +EXPLAIN +SELECT * FROM City WHERE ID BETWEEN 3500 AND 3800; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range PRIMARY PRIMARY 4 NULL 301 Using where +EXPLAIN +SELECT * FROM City WHERE ID BETWEEN 4000 AND 4300; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range PRIMARY PRIMARY 4 NULL 80 Using where +EXPLAIN +SELECT * FROM City WHERE ID BETWEEN 250 and 260 ; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range PRIMARY PRIMARY 4 NULL 11 Using where +EXPLAIN +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 39 Using where +EXPLAIN +SELECT * FROM City WHERE (Population > 101000 AND Population < 103000); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Population Population 4 NULL 81 Using where +EXPLAIN +SELECT * FROM City WHERE Name LIKE 'Pa%'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Name Name 35 NULL 41 Using where +EXPLAIN +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); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City index_merge PRIMARY,Population,Country,Name,CountryPopulation,CountryName CountryPopulation,PRIMARY 7,4 NULL 14 Using sort_union(CountryPopulation,PRIMARY); Using where +EXPLAIN +SELECT * FROM City +WHERE ((Population > 101000 AND Population < 103000) OR +ID BETWEEN 3790 AND 3800) AND Country='USA' + AND (Name LIKE 'Pa%' OR ID BETWEEN 4028 AND 4032); +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); +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 () +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); +ID Name Country Population +4030 Sandy USA 101853 +4031 Athens-Clarke County USA 101489 +4032 Cambridge USA 101355 +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); +ID Name Country Population +4030 Sandy USA 101853 +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 4028 AND 4032); +ID Name Country Population +4030 Sandy USA 101853 +4031 Athens-Clarke County USA 101489 +4032 Cambridge USA 101355 +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 4028 AND 4032); +ID Name Country Population +4030 Sandy USA 101853 +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); +ID Name Country Population +4030 Sandy USA 101853 +4031 Athens-Clarke County USA 101489 +4032 Cambridge USA 101355 +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); +ID Name Country Population +4030 Sandy USA 101853 +4031 Athens-Clarke County USA 101489 +4032 Cambridge USA 101355 +EXPLAIN +SELECT * FROM City +WHERE ((Population > 101000 and Population < 102000) OR +ID BETWEEN 3790 AND 3800) AND Country='USA' + OR (Name LIKE 'Pa%' OR ID BETWEEN 250 AND 260) AND Country='BRA'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City index_merge PRIMARY,Population,Country,Name,CountryPopulation,CountryName CountryPopulation,PRIMARY,CountryName 7,4,38 NULL 35 Using sort_union(CountryPopulation,PRIMARY,CountryName); Using where +SELECT * FROM City USE INDEX () +WHERE ((Population > 101000 and Population < 102000) OR +ID BETWEEN 3790 AND 3800) AND Country='USA' + OR (Name LIKE 'Pa%' OR ID BETWEEN 250 AND 260) AND Country='BRA'; +ID Name Country Population +250 Mauá BRA 375055 +251 Carapicuíba BRA 357552 +252 Olinda BRA 354732 +253 Campina Grande BRA 352497 +254 São José do Rio Preto BRA 351944 +255 Caxias do Sul BRA 349581 +256 Moji das Cruzes BRA 339194 +257 Diadema BRA 335078 +258 Aparecida de Goiânia BRA 324662 +259 Piracicaba BRA 319104 +260 Cariacica BRA 319033 +285 Paulista BRA 248473 +339 Passo Fundo BRA 166343 +364 Parnaíba BRA 129756 +372 Paranaguá BRA 126076 +379 Palmas BRA 121919 +386 Patos de Minas BRA 119262 +424 Passos BRA 98570 +430 Paulo Afonso BRA 97291 +435 Parnamirim BRA 96210 +448 Patos BRA 90519 +451 Palhoça BRA 89465 +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 +4030 Sandy USA 101853 +4031 Athens-Clarke County USA 101489 +4032 Cambridge USA 101355 +SELECT * FROM City +WHERE ((Population > 101000 and Population < 102000) OR +ID BETWEEN 3790 AND 3800) AND Country='USA' + OR (Name LIKE 'Pa%' OR ID BETWEEN 250 AND 260) AND Country='BRA'; +ID Name Country Population +250 Mauá BRA 375055 +251 Carapicuíba BRA 357552 +252 Olinda BRA 354732 +253 Campina Grande BRA 352497 +254 São José do Rio Preto BRA 351944 +255 Caxias do Sul BRA 349581 +256 Moji das Cruzes BRA 339194 +257 Diadema BRA 335078 +258 Aparecida de Goiânia BRA 324662 +259 Piracicaba BRA 319104 +260 Cariacica BRA 319033 +285 Paulista BRA 248473 +339 Passo Fundo BRA 166343 +364 Parnaíba BRA 129756 +372 Paranaguá BRA 126076 +379 Palmas BRA 121919 +386 Patos de Minas BRA 119262 +424 Passos BRA 98570 +430 Paulo Afonso BRA 97291 +435 Parnamirim BRA 96210 +448 Patos BRA 90519 +451 Palhoça BRA 89465 +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 +4030 Sandy USA 101853 +4031 Athens-Clarke County USA 101489 +4032 Cambridge USA 101355 +EXPLAIN +SELECT * FROM City +WHERE ((Population > 101000 AND Population < 11000) OR +ID BETWEEN 3500 AND 3800) AND Country='USA' + AND (Name LIKE 'P%' OR ID BETWEEN 4000 AND 4300); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range PRIMARY,Population,Country,Name,CountryPopulation,CountryName CountryName 38 NULL 23 Using where +EXPLAIN +SELECT * FROM City +WHERE ((Population > 101000 AND Population < 11000) OR +ID BETWEEN 3500 AND 3800) AND Country='USA' + AND (Name LIKE 'Pho%' OR ID BETWEEN 4000 AND 4300); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range PRIMARY,Population,Country,Name,CountryPopulation,CountryName Name 35 NULL 1 Using where +SELECT * FROM City USE INDEX () +WHERE ((Population > 101000 AND Population < 11000) OR +ID BETWEEN 3500 AND 3800) AND Country='USA' + AND (Name LIKE 'P%' OR ID BETWEEN 4000 AND 4300); +ID Name Country Population +3797 Philadelphia USA 1517550 +3798 Phoenix USA 1321045 +SELECT * FROM City +WHERE ((Population > 101000 AND Population < 11000) OR +ID BETWEEN 3500 AND 3800) AND Country='USA' + AND (Name LIKE 'P%' OR ID BETWEEN 4000 AND 4300); +ID Name Country Population +3797 Philadelphia USA 1517550 +3798 Phoenix USA 1321045 +SELECT * FROM City USE INDEX () +WHERE ((Population > 101000 AND Population < 11000) OR +ID BETWEEN 3500 AND 3800) AND Country='USA' + AND (Name LIKE 'Pho%' OR ID BETWEEN 4000 AND 4300); +ID Name Country Population +3798 Phoenix USA 1321045 +SELECT * FROM City +WHERE ((Population > 101000 AND Population < 11000) OR +ID BETWEEN 3500 AND 3800) AND Country='USA' + AND (Name LIKE 'Pho%' OR ID BETWEEN 4000 AND 4300); +ID Name Country Population +3798 Phoenix USA 1321045 +DROP DATABASE world; +use test; +CREATE TABLE t1 ( +id int(10) unsigned NOT NULL auto_increment, +account_id int(10) unsigned NOT NULL, +first_name varchar(50) default NULL, +middle_name varchar(50) default NULL, +last_name varchar(100) default NULL, +home_address_1 varchar(150) default NULL, +home_city varchar(75) default NULL, +home_state char(2) default NULL, +home_postal_code varchar(50) default NULL, +home_county varchar(75) default NULL, +home_country char(3) default NULL, +work_address_1 varchar(150) default NULL, +work_city varchar(75) default NULL, +work_state char(2) default NULL, +work_postal_code varchar(50) default NULL, +work_county varchar(75) default NULL, +work_country char(3) default NULL, +login varchar(50) NOT NULL, +PRIMARY KEY (id), +KEY login (login,account_id), +KEY account_id (account_id), +KEY user_home_country_indx (home_country), +KEY user_work_country_indx (work_country), +KEY user_home_state_indx (home_state), +KEY user_work_state_indx (work_state), +KEY user_home_city_indx (home_city), +KEY user_work_city_indx (work_city), +KEY user_first_name_indx (first_name), +KEY user_last_name_indx (last_name) +); +insert into t1(account_id, login, home_state, work_state) values +(1, 'pw', 'ia', 'ia'), (1, 'pw', 'ia', 'ia'), (1, 'pw', 'ia', 'ia'), +(1, 'pw', 'ia', 'ia'), (1, 'pw', 'ia', 'ia'), (1, 'pw', 'ia', 'ia'); +insert into t1(account_id, login, home_state, work_state) +select 1, 'pw', 'ak', 'ak' from t1; +insert into t1(account_id, login, home_state, work_state) +select 1, 'pw', 'ak', 'ak' from t1; +insert into t1(account_id, login, home_state, work_state) +select 1, 'pw', 'ak', 'ak' from t1; +insert into t1(account_id, login, home_state, work_state) +select 1, 'pw', 'ak', 'ak' from t1; +insert into t1(account_id, login, home_state, work_state) +select 1, 'pw', 'ak', 'ak' from t1; +insert into t1(account_id, login, home_state, work_state) +select 1, 'pw', 'ak', 'ak' from t1; +insert into t1(account_id, login, home_state, work_state) +select 1, 'pw', 'ak', 'ak' from t1; +insert into t1(account_id, login, home_state, work_state) +select 1, 'pw', 'ak', 'ak' from t1; +insert into t1(account_id, login, home_state, work_state) +select 1, 'pw', 'ak', 'ak' from t1; +analyze table t1; +Table Op Msg_type Msg_text +test.t1 analyze status OK +select count(*) from t1 where account_id = 1; +count(*) +3072 +select * from t1 +where (home_state = 'ia' or work_state='ia') and account_id = 1; +id account_id first_name middle_name last_name home_address_1 home_city home_state home_postal_code home_county home_country work_address_1 work_city work_state work_postal_code work_county work_country login +1 1 NULL NULL NULL NULL NULL ia NULL NULL NULL NULL NULL ia NULL NULL NULL pw +2 1 NULL NULL NULL NULL NULL ia NULL NULL NULL NULL NULL ia NULL NULL NULL pw +3 1 NULL NULL NULL NULL NULL ia NULL NULL NULL NULL NULL ia NULL NULL NULL pw +4 1 NULL NULL NULL NULL NULL ia NULL NULL NULL NULL NULL ia NULL NULL NULL pw +5 1 NULL NULL NULL NULL NULL ia NULL NULL NULL NULL NULL ia NULL NULL NULL pw +6 1 NULL NULL NULL NULL NULL ia NULL NULL NULL NULL NULL ia NULL NULL NULL pw +explain +select * from t1 +where (home_state = 'ia' or work_state='ia') and account_id = 1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index_merge account_id,user_home_state_indx,user_work_state_indx user_home_state_indx,user_work_state_indx 3,3 NULL 6 Using union(user_home_state_indx,user_work_state_indx); Using where +drop table t1; +CREATE TABLE t1 ( +c1 int(11) NOT NULL auto_increment, +c2 decimal(10,0) default NULL, +c3 decimal(10,0) default NULL, +c4 decimal(10,0) default NULL, +c5 decimal(10,0) default NULL, +cp decimal(1,0) default NULL, +ce decimal(10,0) default NULL, +cdata char(20), +PRIMARY KEY (c1), +KEY k1 (c2,c3,cp,ce), +KEY k2 (c4,c5,cp,ce) +); +insert into t1 (c2, c3, c4, c5, cp) values(1,1,1,1,1); +insert into t1 (c2, c3, c4, c5, cp) values(2,1,1,1,4); +insert into t1 (c2, c3, c4, c5, cp) values(2,1,2,1,1); +insert into t1 (c2, c3, c4, c5, cp) values(2,1,3,1,4); +insert into t1 (c2, c3, c4, c5, cp) values(3,1,4,1,4); +insert into t1 (c2, c3, c4, c5, cp) +select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) +select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) +select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) +select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) +select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) +select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) +select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) +select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) +select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) +select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) +select c2, c3, c4, c5, cp from t1 where cp = 4; +analyze table t1; +Table Op Msg_type Msg_text +test.t1 analyze status OK +explain +select * from t1 where (c2=1 and c3=1) or (c4=2 and c5=1); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index_merge k1,k2 k1,k2 12,12 NULL 2 Using sort_union(k1,k2); Using where +explain +select * from t1 +where (c2=1 and c3=1 and cp=1) or (c4=2 and c5=1 and cp=1); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index_merge k1,k2 k1,k2 14,14 NULL 2 Using sort_union(k1,k2); Using where +explain +select * from t1 +where ((c2=1 and c3=1) or (c4=2 and c5=1)) and cp=1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index_merge k1,k2 k1,k2 14,14 NULL 2 Using sort_union(k1,k2); Using where +select * from t1 +where (c2=1 and c3=1 and cp=1) or (c4=2 and c5=1 and cp=1); +c1 c2 c3 c4 c5 cp ce cdata +1 1 1 1 1 1 NULL NULL +3 2 1 2 1 1 NULL NULL +select * from t1 +where ((c2=1 and c3=1) or (c4=2 and c5=1)) and cp=1; +c1 c2 c3 c4 c5 cp ce cdata +1 1 1 1 1 1 NULL NULL +3 2 1 2 1 1 NULL NULL +drop table t1; +create table t1 ( +c1 int auto_increment primary key, +c2 char(20), +c3 char (20), +c4 int +); +alter table t1 add key k1 (c2); +alter table t1 add key k2 (c3); +alter table t1 add key k3 (c4); +insert into t1 values(null, 'a', 'b', 0); +insert into t1 values(null, 'c', 'b', 0); +insert into t1 values(null, 'a', 'd', 0); +insert into t1 values(null, 'ccc', 'qqq', 0); +insert into t1 (c2,c3) select c2,c3 from t1 where c2 != 'a'; +insert into t1 (c2,c3) select c2,c3 from t1 where c2 != 'a'; +insert into t1 (c2,c3) select c2,c3 from t1 where c2 != 'a'; +insert into t1 (c2,c3) select c2,c3 from t1 where c2 != 'a'; +insert into t1 (c2,c3) select c2,c3 from t1 where c2 != 'a'; +insert into t1 (c2,c3) select c2,c3 from t1 where c2 != 'a'; +insert into t1 (c2,c3) select c2,c3 from t1 where c2 != 'a'; +insert into t1 (c2,c3,c4) select c2,c3,1 from t1 where c2 != 'a'; +insert into t1 (c2,c3,c4) select c2,c3,2 from t1 where c2 != 'a'; +insert into t1 (c2,c3,c4) select c2,c3,3 from t1 where c2 != 'a'; +insert into t1 (c2,c3,c4) select c2,c3,4 from t1 where c2 != 'a'; +analyze table t1; +Table Op Msg_type Msg_text +test.t1 analyze status OK +select count(*) from t1 where (c2='e' OR c3='q'); +count(*) +0 +select count(*) from t1 where c4 != 0; +count(*) +3840 +explain +select distinct c1 from t1 where (c2='e' OR c3='q'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index_merge k1,k2 k1,k2 21,21 NULL 2 Using union(k1,k2); Using where +explain +select distinct c1 from t1 where (c4!= 0) AND (c2='e' OR c3='q'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index_merge k1,k2,k3 k1,k2 21,21 NULL 2 Using union(k1,k2); Using where +drop table t1; +create table t1 ( +id int unsigned auto_increment primary key, +c1 char(12), +c2 char(15), +c3 char(1) +); +insert into t1 (c3) values ('1'), ('2'); +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +update t1 set c1=lpad(id+1000, 12, ' '), c2=lpad(id+10000, 15, ' '); +alter table t1 add unique index (c1), add unique index (c2), add index (c3); +analyze table t1; +Table Op Msg_type Msg_text +test.t1 analyze status OK +explain +select * from t1 where (c1=' 100000' or c2=' 2000000'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index_merge c1,c2 c1,c2 13,16 NULL 2 Using union(c1,c2); Using where +explain +select * from t1 where (c1=' 100000' or c2=' 2000000') and c3='2'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index_merge c1,c2,c3 c1,c2 13,16 NULL 2 Using union(c1,c2); Using where +select * from t1 where (c1=' 100000' or c2=' 2000000'); +id c1 c2 c3 +select * from t1 where (c1=' 100000' or c2=' 2000000') and c3='2'; +id c1 c2 c3 +drop table t1; === added file 'mysql-test/r/range_vs_index_merge_innodb.result' --- a/mysql-test/r/range_vs_index_merge_innodb.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/r/range_vs_index_merge_innodb.result 2009-10-12 04:59:34 +0000 @@ -0,0 +1,1330 @@ +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); +EXPLAIN +SELECT * FROM City +WHERE (Population >= 100000 OR Name LIKE 'P%' OR Population < 100000); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City ALL Population,Name NULL NULL NULL 4249 Using where +EXPLAIN +SELECT * FROM City +WHERE (Population >= 100000 OR Name LIKE 'P%') AND Country='CAN' OR +(Population < 100000 OR Name Like 'T%') AND Country='ARG'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Population,Country,Name Country 3 NULL 106 Using where +EXPLAIN +SELECT * FROM City +WHERE Population < 200000 AND Name LIKE 'P%' AND +(Population > 300000 OR Name LIKE 'T%') AND +(Population < 100000 OR Name LIKE 'Pa%'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Population,Name Name 35 NULL 235 Using where +EXPLAIN +SELECT * FROM City +WHERE Population > 100000 AND Name LIKE 'Aba%' OR +Country IN ('CAN', 'ARG') AND ID < 3800 OR +Country < 'U' AND Name LIKE 'Zhu%' OR +ID BETWEEN 3800 AND 3810; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City index_merge PRIMARY,Population,Country,Name Name,Country,PRIMARY 35,3,4 NULL 125 Using sort_union(Name,Country,PRIMARY); Using where +EXPLAIN +SELECT * FROM City +WHERE (Population > 101000 AND Population < 115000); +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); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Population Population 4 NULL 80 Using where +EXPLAIN +SELECT * FROM City +WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F')); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City index_merge Country,Name Name,Country 35,3 NULL 213 Using sort_union(Name,Country); Using where +EXPLAIN +SELECT * FROM City +WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F')) +AND (Population > 101000 AND Population < 115000); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City index_merge Population,Country,Name Name,Country 35,3 NULL 213 Using sort_union(Name,Country); Using where +EXPLAIN +SELECT * FROM City +WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F')) +AND (Population > 101000 AND Population < 103000); +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 +SELECT * FROM City USE INDEX () +WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F')) +AND (Population > 101000 AND Population < 115000); +ID Name Country Population +403 Catanduva BRA 107761 +412 Cachoeirinha BRA 103240 +636 Bilbays EGY 113608 +637 Mit Ghamr EGY 101801 +701 Tarragona ESP 113016 +702 Lleida (Lérida) ESP 112207 +703 Jaén ESP 109247 +704 Ourense (Orense) ESP 109120 +705 Mataró ESP 104095 +706 Algeciras ESP 103106 +707 Marbella ESP 101144 +759 Gonder ETH 112249 +869 Cabuyao PHL 106630 +870 Calapan PHL 105910 +873 Cauayan PHL 103952 +1844 Cape Breton CAN 114733 +1847 Cambridge CAN 109186 +2908 Cajamarca PER 108009 +3003 Caen FRA 113987 +3411 Ceyhan TUR 102412 +3571 Calabozo VEN 107146 +3786 Cam Ranh VNM 114041 +3792 Tartu EST 101246 +4002 Carrollton USA 109576 +4027 Cape Coral USA 102286 +4032 Cambridge USA 101355 +SELECT * FROM City +WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F')) +AND (Population > 101000 AND Population < 115000); +ID Name Country Population +403 Catanduva BRA 107761 +412 Cachoeirinha BRA 103240 +636 Bilbays EGY 113608 +637 Mit Ghamr EGY 101801 +701 Tarragona ESP 113016 +702 Lleida (Lérida) ESP 112207 +703 Jaén ESP 109247 +704 Ourense (Orense) ESP 109120 +705 Mataró ESP 104095 +706 Algeciras ESP 103106 +707 Marbella ESP 101144 +759 Gonder ETH 112249 +869 Cabuyao PHL 106630 +870 Calapan PHL 105910 +873 Cauayan PHL 103952 +1844 Cape Breton CAN 114733 +1847 Cambridge CAN 109186 +2908 Cajamarca PER 108009 +3003 Caen FRA 113987 +3411 Ceyhan TUR 102412 +3571 Calabozo VEN 107146 +3786 Cam Ranh VNM 114041 +3792 Tartu EST 101246 +4002 Carrollton USA 109576 +4027 Cape Coral USA 102286 +4032 Cambridge USA 101355 +SELECT * FROM City USE INDEX () +WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F')) +AND (Population > 101000 AND Population < 103000); +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); +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 +1 SIMPLE City range Name Name 35 NULL 23 Using where +EXPLAIN +SELECT * FROM City WHERE (Name < 'C'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City ALL Name NULL NULL NULL 4249 Using where +EXPLAIN +SELECT * FROM City WHERE (Country > 'A' AND Country < 'B'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Country Country 3 NULL 106 Using where +EXPLAIN +SELECT * FROM City WHERE (Name BETWEEN 'P' AND 'Pb'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Name Name 35 NULL 71 Using where +EXPLAIN +SELECT * FROM City WHERE (Name BETWEEN 'P' AND 'T'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City ALL Name NULL NULL NULL 4249 Using where +EXPLAIN +SELECT * FROM City WHERE (Population > 101000 AND Population < 110000); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Population Population 4 NULL 327 Using where +EXPLAIN +SELECT * FROM City WHERE (Population > 103000 AND Population < 104000); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Population Population 4 NULL 36 Using where +EXPLAIN +SELECT * FROM City +WHERE (Name < 'Ac' AND (Country > 'A' AND Country < 'B')) OR +(Name BETWEEN 'P' AND 'Pb' AND (Population > 101000 AND Population < 110000)); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Population,Country,Name Name 35 NULL 94 Using where +EXPLAIN +SELECT * FROM City +WHERE (Name < 'Ac' AND (Country > 'A' AND Country < 'B')) OR +(Name BETWEEN 'P' AND 'T' AND (Population > 103000 AND Population < 104000)); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City index_merge Population,Country,Name Name,Population 35,4 NULL 59 Using sort_union(Name,Population); Using where +EXPLAIN +SELECT * FROM City +WHERE (Name < 'C' AND (Country > 'A' AND Country < 'B')) OR +(Name BETWEEN 'P' AND 'Pb' AND (Population > 101000 AND Population < 110000)); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City index_merge Population,Country,Name Country,Name 3,35 NULL 177 Using sort_union(Country,Name); Using where +EXPLAIN +SELECT * FROM City +WHERE (Name < 'C' AND (Country > 'A' AND Country < 'B')) OR +(Name BETWEEN 'P' AND 'T' AND (Population > 103000 AND Population < 104000)); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City index_merge Population,Country,Name Country,Population 3,4 NULL 142 Using sort_union(Country,Population); Using where +SELECT * FROM City USE INDEX () +WHERE (Name < 'Ac' AND (Country > 'A' AND Country < 'B')) OR +(Name BETWEEN 'P' AND 'Pb' AND (Population > 101000 AND Population < 110000)); +ID Name Country Population +65 Abu Dhabi ARE 398695 +168 Pabna BGD 103277 +189 Parakou BEN 103577 +750 Paarl ZAF 105768 +2865 Pak Pattan PAK 107800 +SELECT * FROM City +WHERE (Name < 'Ac' AND (Country > 'A' AND Country < 'B')) OR +(Name BETWEEN 'P' AND 'Pb' AND (Population > 101000 AND Population < 110000)); +ID Name Country Population +65 Abu Dhabi ARE 398695 +750 Paarl ZAF 105768 +168 Pabna BGD 103277 +2865 Pak Pattan PAK 107800 +189 Parakou BEN 103577 +SELECT * FROM City USE INDEX () +WHERE (Name < 'Ac' AND (Country > 'A' AND Country < 'B')) OR +(Name BETWEEN 'P' AND 'T' AND (Population > 103000 AND Population < 104000)); +ID Name Country Population +65 Abu Dhabi ARE 398695 +168 Pabna BGD 103277 +189 Parakou BEN 103577 +914 Sekondi-Takoradi GHA 103653 +1003 Pemalang IDN 103500 +2663 Río Bravo MEX 103901 +SELECT * FROM City +WHERE (Name < 'Ac' AND (Country > 'A' AND Country < 'B')) OR +(Name BETWEEN 'P' AND 'T' AND (Population > 103000 AND Population < 104000)); +ID Name Country Population +65 Abu Dhabi ARE 398695 +168 Pabna BGD 103277 +189 Parakou BEN 103577 +914 Sekondi-Takoradi GHA 103653 +1003 Pemalang IDN 103500 +2663 Río Bravo MEX 103901 +SELECT * FROM City USE INDEX () +WHERE (Name < 'C' AND (Country > 'A' AND Country < 'B')) OR +(Name BETWEEN 'P' AND 'Pb' AND (Population > 101000 AND Population < 110000)); +ID Name Country Population +55 Andorra la Vella AND 21189 +59 Benguela AGO 128300 +65 Abu Dhabi ARE 398695 +67 al-Ayn ARE 225970 +68 Ajman ARE 114395 +69 Buenos Aires ARG 2982146 +75 Almirante Brown ARG 538918 +85 Avellaneda ARG 353046 +93 Berazategui ARG 276916 +96 Bahía Blanca ARG 239810 +132 Brisbane AUS 1291117 +134 Adelaide AUS 978100 +144 Baku AZE 1787800 +168 Pabna BGD 103277 +189 Parakou BEN 103577 +750 Paarl ZAF 105768 +2865 Pak Pattan PAK 107800 +SELECT * FROM City +WHERE (Name < 'C' AND (Country > 'A' AND Country < 'B')) OR +(Name BETWEEN 'P' AND 'Pb' AND (Population > 101000 AND Population < 110000)); +ID Name Country Population +55 Andorra la Vella AND 21189 +59 Benguela AGO 128300 +65 Abu Dhabi ARE 398695 +67 al-Ayn ARE 225970 +68 Ajman ARE 114395 +69 Buenos Aires ARG 2982146 +75 Almirante Brown ARG 538918 +85 Avellaneda ARG 353046 +93 Berazategui ARG 276916 +96 Bahía Blanca ARG 239810 +132 Brisbane AUS 1291117 +134 Adelaide AUS 978100 +144 Baku AZE 1787800 +168 Pabna BGD 103277 +189 Parakou BEN 103577 +750 Paarl ZAF 105768 +2865 Pak Pattan PAK 107800 +SELECT * FROM City USE INDEX () +WHERE (Name < 'C' AND (Country > 'A' AND Country < 'B')) OR +(Name BETWEEN 'P' AND 'T' AND (Population > 103000 AND Population < 104000)); +ID Name Country Population +55 Andorra la Vella AND 21189 +59 Benguela AGO 128300 +65 Abu Dhabi ARE 398695 +67 al-Ayn ARE 225970 +68 Ajman ARE 114395 +69 Buenos Aires ARG 2982146 +75 Almirante Brown ARG 538918 +85 Avellaneda ARG 353046 +93 Berazategui ARG 276916 +96 Bahía Blanca ARG 239810 +132 Brisbane AUS 1291117 +134 Adelaide AUS 978100 +144 Baku AZE 1787800 +168 Pabna BGD 103277 +189 Parakou BEN 103577 +914 Sekondi-Takoradi GHA 103653 +1003 Pemalang IDN 103500 +2663 Río Bravo MEX 103901 +SELECT * FROM City +WHERE (Name < 'C' AND (Country > 'A' AND Country < 'B')) OR +(Name BETWEEN 'P' AND 'T' AND (Population > 103000 AND Population < 104000)); +ID Name Country Population +55 Andorra la Vella AND 21189 +59 Benguela AGO 128300 +65 Abu Dhabi ARE 398695 +67 al-Ayn ARE 225970 +68 Ajman ARE 114395 +69 Buenos Aires ARG 2982146 +75 Almirante Brown ARG 538918 +85 Avellaneda ARG 353046 +93 Berazategui ARG 276916 +96 Bahía Blanca ARG 239810 +132 Brisbane AUS 1291117 +134 Adelaide AUS 978100 +144 Baku AZE 1787800 +168 Pabna BGD 103277 +189 Parakou BEN 103577 +914 Sekondi-Takoradi GHA 103653 +1003 Pemalang IDN 103500 +2663 Río Bravo MEX 103901 +EXPLAIN +SELECT * FROM City WHERE (ID < 50) OR (ID BETWEEN 100 AND 110); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range PRIMARY PRIMARY 4 NULL 60 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 +1 SIMPLE City range PRIMARY PRIMARY 4 NULL 1142 Using where +EXPLAIN +SELECT * FROM City WHERE (ID < 600) OR (ID BETWEEN 900 AND 1800); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range PRIMARY PRIMARY 4 NULL 2950 Using where +EXPLAIN +SELECT * FROM City WHERE Country > 'A' AND Country < 'ARG'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Country Country 3 NULL 19 Using where +EXPLAIN +SELECT * FROM City WHERE Name LIKE 'H%' OR Name LIKE 'P%' ; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Name Name 35 NULL 394 Using where +EXPLAIN +SELECT * FROM City WHERE Name LIKE 'Ha%' OR Name LIKE 'Pa%' ; +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'))) +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 +EXPLAIN +SELECT * FROM City +WHERE ((ID < 800) AND (Name LIKE 'Ha%' OR (Country > 'A' AND Country < 'ARG'))) +OR ((ID BETWEEN 900 AND 1800) 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 index_merge PRIMARY,Population,Country,Name Name,Country,Population 35,3,4 NULL 188 Using sort_union(Name,Country,Population); Using where +EXPLAIN +SELECT * FROM City +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 1062 Using where +SELECT * FROM City USE INDEX () +WHERE ((ID < 50) 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 +1 Kabul AFG 1780000 +2 Qandahar AFG 237500 +3 Herat AFG 186800 +4 Mazar-e-Sharif AFG 127800 +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'))) +OR ((ID BETWEEN 100 AND 110) AND +(Name LIKE 'P%' OR (Population > 103000 AND Population < 104000))); +ID Name Country Population +1 Kabul AFG 1780000 +2 Qandahar AFG 237500 +3 Herat AFG 186800 +4 Mazar-e-Sharif AFG 127800 +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() +WHERE ((ID < 800) AND (Name LIKE 'Ha%' OR (Country > 'A' AND Country < 'ARG'))) +OR ((ID BETWEEN 900 AND 1800) AND +(Name LIKE 'Pa%' OR (Population > 103000 AND Population < 104000))); +ID Name Country Population +1 Kabul AFG 1780000 +2 Qandahar AFG 237500 +3 Herat AFG 186800 +4 Mazar-e-Sharif AFG 127800 +7 Haag NLD 440900 +16 Haarlem NLD 148772 +25 Haarlemmermeer NLD 110722 +33 Willemstad ANT 2345 +34 Tirana ALB 270000 +55 Andorra la Vella AND 21189 +56 Luanda AGO 2022000 +57 Huambo AGO 163100 +58 Lobito AGO 130000 +59 Benguela AGO 128300 +60 Namibe AGO 118200 +61 South Hill AIA 961 +62 The Valley AIA 595 +64 Dubai ARE 669181 +65 Abu Dhabi ARE 398695 +66 Sharja ARE 320095 +67 al-Ayn ARE 225970 +68 Ajman ARE 114395 +129 Oranjestad ABW 29034 +191 Hamilton BMU 1200 +528 Hartlepool GBR 92000 +529 Halifax GBR 91069 +914 Sekondi-Takoradi GHA 103653 +943 Palembang IDN 1222764 +950 Padang IDN 534474 +983 Palu IDN 142800 +984 Pasuruan IDN 134019 +991 Pangkal Pinang IDN 124000 +1003 Pemalang IDN 103500 +1004 Klaten IDN 103300 +1007 Palangka Raya IDN 99693 +1020 Padang Sidempuan IDN 91200 +1045 Patna IND 917243 +1114 Panihati IND 275990 +1129 Patiala IND 238368 +1142 Panipat IND 215218 +1159 Parbhani IND 190255 +1231 Pali IND 136842 +1263 Pathankot IND 123930 +1265 Palghat (Palakkad) IND 123289 +1293 Pallavaram IND 111866 +1319 Tellicherry (Thalassery) IND 103579 +1339 Palayankottai IND 97662 +1345 Patan IND 96109 +1436 Marv Dasht IRN 103579 +1468 Palermo ITA 683794 +1478 Padova ITA 211391 +1484 Parma ITA 168717 +1530 Kingston JAM 103962 +1747 Toda JPN 103969 +1748 Tajimi JPN 103171 +1785 Ibb YEM 103300 +SELECT * FROM City +WHERE ((ID < 800) AND (Name LIKE 'Ha%' OR (Country > 'A' AND Country < 'ARG'))) +OR ((ID BETWEEN 900 AND 1800) AND +(Name LIKE 'Pa%' OR (Population > 103000 AND Population < 104000))); +ID Name Country Population +1 Kabul AFG 1780000 +2 Qandahar AFG 237500 +3 Herat AFG 186800 +4 Mazar-e-Sharif AFG 127800 +7 Haag NLD 440900 +16 Haarlem NLD 148772 +25 Haarlemmermeer NLD 110722 +33 Willemstad ANT 2345 +34 Tirana ALB 270000 +55 Andorra la Vella AND 21189 +56 Luanda AGO 2022000 +57 Huambo AGO 163100 +58 Lobito AGO 130000 +59 Benguela AGO 128300 +60 Namibe AGO 118200 +61 South Hill AIA 961 +62 The Valley AIA 595 +64 Dubai ARE 669181 +65 Abu Dhabi ARE 398695 +66 Sharja ARE 320095 +67 al-Ayn ARE 225970 +68 Ajman ARE 114395 +129 Oranjestad ABW 29034 +191 Hamilton BMU 1200 +528 Hartlepool GBR 92000 +529 Halifax GBR 91069 +914 Sekondi-Takoradi GHA 103653 +943 Palembang IDN 1222764 +950 Padang IDN 534474 +983 Palu IDN 142800 +984 Pasuruan IDN 134019 +991 Pangkal Pinang IDN 124000 +1003 Pemalang IDN 103500 +1004 Klaten IDN 103300 +1007 Palangka Raya IDN 99693 +1020 Padang Sidempuan IDN 91200 +1045 Patna IND 917243 +1114 Panihati IND 275990 +1129 Patiala IND 238368 +1142 Panipat IND 215218 +1159 Parbhani IND 190255 +1231 Pali IND 136842 +1263 Pathankot IND 123930 +1265 Palghat (Palakkad) IND 123289 +1293 Pallavaram IND 111866 +1319 Tellicherry (Thalassery) IND 103579 +1339 Palayankottai IND 97662 +1345 Patan IND 96109 +1436 Marv Dasht IRN 103579 +1468 Palermo ITA 683794 +1478 Padova ITA 211391 +1484 Parma ITA 168717 +1530 Kingston JAM 103962 +1747 Toda JPN 103969 +1748 Tajimi JPN 103171 +1785 Ibb YEM 103300 +SELECT * FROM City USE INDEX () +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 +1 Kabul AFG 1780000 +2 Qandahar AFG 237500 +3 Herat AFG 186800 +4 Mazar-e-Sharif AFG 127800 +7 Haag NLD 440900 +16 Haarlem NLD 148772 +25 Haarlemmermeer NLD 110722 +33 Willemstad ANT 2345 +34 Tirana ALB 270000 +55 Andorra la Vella AND 21189 +56 Luanda AGO 2022000 +57 Huambo AGO 163100 +58 Lobito AGO 130000 +59 Benguela AGO 128300 +60 Namibe AGO 118200 +61 South Hill AIA 961 +62 The Valley AIA 595 +64 Dubai ARE 669181 +65 Abu Dhabi ARE 398695 +66 Sharja ARE 320095 +67 al-Ayn ARE 225970 +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 +SELECT * FROM City +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 +1 Kabul AFG 1780000 +2 Qandahar AFG 237500 +3 Herat AFG 186800 +4 Mazar-e-Sharif AFG 127800 +7 Haag NLD 440900 +16 Haarlem NLD 148772 +25 Haarlemmermeer NLD 110722 +33 Willemstad ANT 2345 +34 Tirana ALB 270000 +55 Andorra la Vella AND 21189 +56 Luanda AGO 2022000 +57 Huambo AGO 163100 +58 Lobito AGO 130000 +59 Benguela AGO 128300 +60 Namibe AGO 118200 +61 South Hill AIA 961 +62 The Valley AIA 595 +64 Dubai ARE 669181 +65 Abu Dhabi ARE 398695 +66 Sharja ARE 320095 +67 al-Ayn ARE 225970 +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 +1 SIMPLE City range Population Population 4 NULL 38 Using where +EXPLAIN +SELECT * FROM City WHERE Population > 101000 AND Population < 110000; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Population Population 4 NULL 327 Using where +EXPLAIN +SELECT * FROM City WHERE Country < 'C'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Country Country 3 NULL 446 Using where +EXPLAIN +SELECT * FROM City WHERE Country < 'AGO'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Country Country 3 NULL 5 Using where +EXPLAIN +SELECT * FROM City WHERE Name BETWEEN 'P' AND 'T'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City ALL Name NULL NULL NULL 4249 Using where +EXPLAIN +SELECT * FROM City WHERE Name BETWEEN 'P' AND 'Pb'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Name Name 35 NULL 71 Using where +EXPLAIN +SELECT * FROM City WHERE ID BETWEEN 3400 AND 3800; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range PRIMARY PRIMARY 4 NULL 944 Using where +EXPLAIN +SELECT * FROM City WHERE ID BETWEEN 3790 AND 3800; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range PRIMARY PRIMARY 4 NULL 11 Using where +EXPLAIN +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 < 102000) AND +(Country < 'C' OR Name BETWEEN 'P' AND 'T')) OR +((ID BETWEEN 3400 AND 3800) AND +(Country < 'AGO' OR Name LIKE 'Pa%')); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City index_merge PRIMARY,Population,Country,Name Country,Name,Population 3,35,4 NULL 114 Using sort_union(Country,Name,Population); Using where +EXPLAIN +SELECT * FROM City +WHERE ((Population > 101000 AND Population < 110000) AND +(Country < 'AGO' OR Name BETWEEN 'P' AND 'Pb')) OR +((ID BETWEEN 3790 AND 3800) AND +(Country < 'C' OR Name LIKE 'P%')); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City index_merge PRIMARY,Population,Country,Name Country,Name,PRIMARY 3,35,4 NULL 87 Using sort_union(Country,Name,PRIMARY); Using where +SELECT * FROM City USE INDEX () +WHERE ((Population > 101000 AND Population < 102000) AND +(Country < 'C' OR Name BETWEEN 'P' AND 'T')) OR +((ID BETWEEN 3400 AND 3800) AND +(Country < 'AGO' OR Name LIKE 'Pa%')); +ID Name Country Population +169 Naogaon BGD 101266 +205 Francistown BWA 101805 +417 Itaituba BRA 101320 +418 Araras BRA 101046 +751 Potchefstroom ZAF 101817 +1752 Sakata JPN 101651 +1851 Saint John´s CAN 101936 +1853 Saanich CAN 101388 +2909 Puno PER 101578 +3463 Pavlograd UKR 127000 +4030 Sandy USA 101853 +SELECT * FROM City +WHERE ((Population > 101000 AND Population < 102000) AND +(Country < 'C' OR Name BETWEEN 'P' AND 'T')) OR +((ID BETWEEN 3400 AND 3800) AND +(Country < 'AGO' OR Name LIKE 'Pa%')); +ID Name Country Population +169 Naogaon BGD 101266 +205 Francistown BWA 101805 +417 Itaituba BRA 101320 +418 Araras BRA 101046 +751 Potchefstroom ZAF 101817 +1752 Sakata JPN 101651 +1851 Saint John´s CAN 101936 +1853 Saanich CAN 101388 +2909 Puno PER 101578 +3463 Pavlograd UKR 127000 +4030 Sandy USA 101853 +SELECT * FROM City USE INDEX () +WHERE ((Population > 101000 AND Population < 110000) AND +(Country < 'AGO' OR Name BETWEEN 'P' AND 'Pb')) OR +((ID BETWEEN 3790 AND 3800) AND +(Country < 'C' OR Name LIKE 'P%')); +ID Name Country Population +168 Pabna BGD 103277 +189 Parakou BEN 103577 +750 Paarl ZAF 105768 +2865 Pak Pattan PAK 107800 +3797 Philadelphia USA 1517550 +3798 Phoenix USA 1321045 +SELECT * FROM City +WHERE ((Population > 101000 AND Population < 110000) AND +(Country < 'AGO' OR Name BETWEEN 'P' AND 'Pb')) OR +((ID BETWEEN 3790 AND 3800) AND +(Country < 'C' OR Name LIKE 'P%')); +ID Name Country Population +168 Pabna BGD 103277 +189 Parakou BEN 103577 +750 Paarl ZAF 105768 +2865 Pak Pattan PAK 107800 +3797 Philadelphia USA 1517550 +3798 Phoenix USA 1321045 +CREATE INDEX CountryPopulation ON City(Country,Population); +EXPLAIN +SELECT * FROM City WHERE Name LIKE 'Pas%'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Name Name 35 NULL 8 Using where +EXPLAIN +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); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Population Population 4 NULL 80 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%') +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 +EXPLAIN +SELECT * FROM City +WHERE ((Population > 101000 AND Population < 103000) OR Name LIKE 'P%') +AND Country='USA'; +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%') +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%') +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'; +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 +SELECT * FROM City USE INDEX () +WHERE ((Population > 101000 AND Population < 103000) OR Name LIKE 'P%') +AND Country='USA'; +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 +CREATE INDEX CountryName ON City(Country,Name); +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,CountryName Country 3 const 274 Using where +EXPLAIN +SELECT * FROM City WHERE Country='BRA'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City ref Country,CountryPopulation,CountryName Country 3 const 250 Using where +EXPLAIN +SELECT * FROM City WHERE ID BETWEEN 3790 AND 3800; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range PRIMARY PRIMARY 4 NULL 11 Using where +EXPLAIN +SELECT * FROM City WHERE ID BETWEEN 4025 AND 4035; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range PRIMARY PRIMARY 4 NULL 11 Using where +EXPLAIN +SELECT * FROM City WHERE ID BETWEEN 4028 AND 4032; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range PRIMARY PRIMARY 4 NULL 5 Using where +EXPLAIN +SELECT * FROM City WHERE ID BETWEEN 3500 AND 3800; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range PRIMARY PRIMARY 4 NULL 300 Using where +EXPLAIN +SELECT * FROM City WHERE ID BETWEEN 4000 AND 4300; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range PRIMARY PRIMARY 4 NULL 80 Using where +EXPLAIN +SELECT * FROM City WHERE ID BETWEEN 250 and 260 ; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range PRIMARY PRIMARY 4 NULL 11 Using where +EXPLAIN +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 38 Using where +EXPLAIN +SELECT * FROM City WHERE (Population > 101000 AND Population < 103000); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Population Population 4 NULL 80 Using where +EXPLAIN +SELECT * FROM City WHERE Name LIKE 'Pa%'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range Name Name 35 NULL 71 Using where +EXPLAIN +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); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City index_merge PRIMARY,Population,Country,Name,CountryPopulation,CountryName CountryPopulation,PRIMARY 7,4 NULL 13 Using sort_union(CountryPopulation,PRIMARY); Using where +EXPLAIN +SELECT * FROM City +WHERE ((Population > 101000 AND Population < 103000) OR +ID BETWEEN 3790 AND 3800) AND Country='USA' + AND (Name LIKE 'Pa%' OR ID BETWEEN 4028 AND 4032); +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); +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 () +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); +ID Name Country Population +4030 Sandy USA 101853 +4031 Athens-Clarke County USA 101489 +4032 Cambridge USA 101355 +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); +ID Name Country Population +4030 Sandy USA 101853 +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 4028 AND 4032); +ID Name Country Population +4030 Sandy USA 101853 +4031 Athens-Clarke County USA 101489 +4032 Cambridge USA 101355 +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 4028 AND 4032); +ID Name Country Population +4030 Sandy USA 101853 +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); +ID Name Country Population +4030 Sandy USA 101853 +4031 Athens-Clarke County USA 101489 +4032 Cambridge USA 101355 +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); +ID Name Country Population +4030 Sandy USA 101853 +4031 Athens-Clarke County USA 101489 +4032 Cambridge USA 101355 +EXPLAIN +SELECT * FROM City +WHERE ((Population > 101000 and Population < 102000) OR +ID BETWEEN 3790 AND 3800) AND Country='USA' + OR (Name LIKE 'Pa%' OR ID BETWEEN 250 AND 260) AND Country='BRA'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City index_merge PRIMARY,Population,Country,Name,CountryPopulation,CountryName CountryPopulation,CountryName,PRIMARY 7,38,4 NULL 35 Using sort_union(CountryPopulation,CountryName,PRIMARY); Using where +SELECT * FROM City USE INDEX () +WHERE ((Population > 101000 and Population < 102000) OR +ID BETWEEN 3790 AND 3800) AND Country='USA' + OR (Name LIKE 'Pa%' OR ID BETWEEN 250 AND 260) AND Country='BRA'; +ID Name Country Population +250 Mauá BRA 375055 +251 Carapicuíba BRA 357552 +252 Olinda BRA 354732 +253 Campina Grande BRA 352497 +254 São José do Rio Preto BRA 351944 +255 Caxias do Sul BRA 349581 +256 Moji das Cruzes BRA 339194 +257 Diadema BRA 335078 +258 Aparecida de Goiânia BRA 324662 +259 Piracicaba BRA 319104 +260 Cariacica BRA 319033 +285 Paulista BRA 248473 +339 Passo Fundo BRA 166343 +364 Parnaíba BRA 129756 +372 Paranaguá BRA 126076 +379 Palmas BRA 121919 +386 Patos de Minas BRA 119262 +424 Passos BRA 98570 +430 Paulo Afonso BRA 97291 +435 Parnamirim BRA 96210 +448 Patos BRA 90519 +451 Palhoça BRA 89465 +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 +4030 Sandy USA 101853 +4031 Athens-Clarke County USA 101489 +4032 Cambridge USA 101355 +SELECT * FROM City +WHERE ((Population > 101000 and Population < 102000) OR +ID BETWEEN 3790 AND 3800) AND Country='USA' + OR (Name LIKE 'Pa%' OR ID BETWEEN 250 AND 260) AND Country='BRA'; +ID Name Country Population +285 Paulista BRA 248473 +339 Passo Fundo BRA 166343 +364 Parnaíba BRA 129756 +372 Paranaguá BRA 126076 +379 Palmas BRA 121919 +386 Patos de Minas BRA 119262 +424 Passos BRA 98570 +430 Paulo Afonso BRA 97291 +435 Parnamirim BRA 96210 +448 Patos BRA 90519 +451 Palhoça BRA 89465 +4030 Sandy USA 101853 +4031 Athens-Clarke County USA 101489 +4032 Cambridge USA 101355 +250 Mauá BRA 375055 +251 Carapicuíba BRA 357552 +252 Olinda BRA 354732 +253 Campina Grande BRA 352497 +254 São José do Rio Preto BRA 351944 +255 Caxias do Sul BRA 349581 +256 Moji das Cruzes BRA 339194 +257 Diadema BRA 335078 +258 Aparecida de Goiânia BRA 324662 +259 Piracicaba BRA 319104 +260 Cariacica BRA 319033 +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 +EXPLAIN +SELECT * FROM City +WHERE ((Population > 101000 AND Population < 11000) OR +ID BETWEEN 3500 AND 3800) AND Country='USA' + AND (Name LIKE 'P%' OR ID BETWEEN 4000 AND 4300); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range PRIMARY,Population,Country,Name,CountryPopulation,CountryName CountryName 38 NULL 18 Using where +EXPLAIN +SELECT * FROM City +WHERE ((Population > 101000 AND Population < 11000) OR +ID BETWEEN 3500 AND 3800) AND Country='USA' + AND (Name LIKE 'Pho%' OR ID BETWEEN 4000 AND 4300); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE City range PRIMARY,Population,Country,Name,CountryPopulation,CountryName Name 35 NULL 1 Using where +SELECT * FROM City USE INDEX () +WHERE ((Population > 101000 AND Population < 11000) OR +ID BETWEEN 3500 AND 3800) AND Country='USA' + AND (Name LIKE 'P%' OR ID BETWEEN 4000 AND 4300); +ID Name Country Population +3797 Philadelphia USA 1517550 +3798 Phoenix USA 1321045 +SELECT * FROM City +WHERE ((Population > 101000 AND Population < 11000) OR +ID BETWEEN 3500 AND 3800) AND Country='USA' + AND (Name LIKE 'P%' OR ID BETWEEN 4000 AND 4300); +ID Name Country Population +3797 Philadelphia USA 1517550 +3798 Phoenix USA 1321045 +SELECT * FROM City USE INDEX () +WHERE ((Population > 101000 AND Population < 11000) OR +ID BETWEEN 3500 AND 3800) AND Country='USA' + AND (Name LIKE 'Pho%' OR ID BETWEEN 4000 AND 4300); +ID Name Country Population +3798 Phoenix USA 1321045 +SELECT * FROM City +WHERE ((Population > 101000 AND Population < 11000) OR +ID BETWEEN 3500 AND 3800) AND Country='USA' + AND (Name LIKE 'Pho%' OR ID BETWEEN 4000 AND 4300); +ID Name Country Population +3798 Phoenix USA 1321045 +DROP DATABASE world; +use test; +CREATE TABLE t1 ( +id int(10) unsigned NOT NULL auto_increment, +account_id int(10) unsigned NOT NULL, +first_name varchar(50) default NULL, +middle_name varchar(50) default NULL, +last_name varchar(100) default NULL, +home_address_1 varchar(150) default NULL, +home_city varchar(75) default NULL, +home_state char(2) default NULL, +home_postal_code varchar(50) default NULL, +home_county varchar(75) default NULL, +home_country char(3) default NULL, +work_address_1 varchar(150) default NULL, +work_city varchar(75) default NULL, +work_state char(2) default NULL, +work_postal_code varchar(50) default NULL, +work_county varchar(75) default NULL, +work_country char(3) default NULL, +login varchar(50) NOT NULL, +PRIMARY KEY (id), +KEY login (login,account_id), +KEY account_id (account_id), +KEY user_home_country_indx (home_country), +KEY user_work_country_indx (work_country), +KEY user_home_state_indx (home_state), +KEY user_work_state_indx (work_state), +KEY user_home_city_indx (home_city), +KEY user_work_city_indx (work_city), +KEY user_first_name_indx (first_name), +KEY user_last_name_indx (last_name) +); +insert into t1(account_id, login, home_state, work_state) values +(1, 'pw', 'ia', 'ia'), (1, 'pw', 'ia', 'ia'), (1, 'pw', 'ia', 'ia'), +(1, 'pw', 'ia', 'ia'), (1, 'pw', 'ia', 'ia'), (1, 'pw', 'ia', 'ia'); +insert into t1(account_id, login, home_state, work_state) +select 1, 'pw', 'ak', 'ak' from t1; +insert into t1(account_id, login, home_state, work_state) +select 1, 'pw', 'ak', 'ak' from t1; +insert into t1(account_id, login, home_state, work_state) +select 1, 'pw', 'ak', 'ak' from t1; +insert into t1(account_id, login, home_state, work_state) +select 1, 'pw', 'ak', 'ak' from t1; +insert into t1(account_id, login, home_state, work_state) +select 1, 'pw', 'ak', 'ak' from t1; +insert into t1(account_id, login, home_state, work_state) +select 1, 'pw', 'ak', 'ak' from t1; +insert into t1(account_id, login, home_state, work_state) +select 1, 'pw', 'ak', 'ak' from t1; +insert into t1(account_id, login, home_state, work_state) +select 1, 'pw', 'ak', 'ak' from t1; +insert into t1(account_id, login, home_state, work_state) +select 1, 'pw', 'ak', 'ak' from t1; +analyze table t1; +Table Op Msg_type Msg_text +test.t1 analyze status OK +select count(*) from t1 where account_id = 1; +count(*) +3072 +select * from t1 +where (home_state = 'ia' or work_state='ia') and account_id = 1; +id account_id first_name middle_name last_name home_address_1 home_city home_state home_postal_code home_county home_country work_address_1 work_city work_state work_postal_code work_county work_country login +1 1 NULL NULL NULL NULL NULL ia NULL NULL NULL NULL NULL ia NULL NULL NULL pw +2 1 NULL NULL NULL NULL NULL ia NULL NULL NULL NULL NULL ia NULL NULL NULL pw +3 1 NULL NULL NULL NULL NULL ia NULL NULL NULL NULL NULL ia NULL NULL NULL pw +4 1 NULL NULL NULL NULL NULL ia NULL NULL NULL NULL NULL ia NULL NULL NULL pw +5 1 NULL NULL NULL NULL NULL ia NULL NULL NULL NULL NULL ia NULL NULL NULL pw +6 1 NULL NULL NULL NULL NULL ia NULL NULL NULL NULL NULL ia NULL NULL NULL pw +explain +select * from t1 +where (home_state = 'ia' or work_state='ia') and account_id = 1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index_merge account_id,user_home_state_indx,user_work_state_indx user_home_state_indx,user_work_state_indx 3,3 NULL 10 Using union(user_home_state_indx,user_work_state_indx); Using where +drop table t1; +CREATE TABLE t1 ( +c1 int(11) NOT NULL auto_increment, +c2 decimal(10,0) default NULL, +c3 decimal(10,0) default NULL, +c4 decimal(10,0) default NULL, +c5 decimal(10,0) default NULL, +cp decimal(1,0) default NULL, +ce decimal(10,0) default NULL, +cdata char(20), +PRIMARY KEY (c1), +KEY k1 (c2,c3,cp,ce), +KEY k2 (c4,c5,cp,ce) +); +insert into t1 (c2, c3, c4, c5, cp) values(1,1,1,1,1); +insert into t1 (c2, c3, c4, c5, cp) values(2,1,1,1,4); +insert into t1 (c2, c3, c4, c5, cp) values(2,1,2,1,1); +insert into t1 (c2, c3, c4, c5, cp) values(2,1,3,1,4); +insert into t1 (c2, c3, c4, c5, cp) values(3,1,4,1,4); +insert into t1 (c2, c3, c4, c5, cp) +select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) +select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) +select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) +select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) +select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) +select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) +select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) +select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) +select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) +select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) +select c2, c3, c4, c5, cp from t1 where cp = 4; +analyze table t1; +Table Op Msg_type Msg_text +test.t1 analyze status OK +explain +select * from t1 where (c2=1 and c3=1) or (c4=2 and c5=1); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index_merge k1,k2 k1,k2 12,12 NULL 2 Using sort_union(k1,k2); Using where +explain +select * from t1 +where (c2=1 and c3=1 and cp=1) or (c4=2 and c5=1 and cp=1); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index_merge k1,k2 k1,k2 14,14 NULL 2 Using sort_union(k1,k2); Using where +explain +select * from t1 +where ((c2=1 and c3=1) or (c4=2 and c5=1)) and cp=1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index_merge k1,k2 k1,k2 14,14 NULL 2 Using sort_union(k1,k2); Using where +select * from t1 +where (c2=1 and c3=1 and cp=1) or (c4=2 and c5=1 and cp=1); +c1 c2 c3 c4 c5 cp ce cdata +1 1 1 1 1 1 NULL NULL +3 2 1 2 1 1 NULL NULL +select * from t1 +where ((c2=1 and c3=1) or (c4=2 and c5=1)) and cp=1; +c1 c2 c3 c4 c5 cp ce cdata +1 1 1 1 1 1 NULL NULL +3 2 1 2 1 1 NULL NULL +drop table t1; +create table t1 ( +c1 int auto_increment primary key, +c2 char(20), +c3 char (20), +c4 int +); +alter table t1 add key k1 (c2); +alter table t1 add key k2 (c3); +alter table t1 add key k3 (c4); +insert into t1 values(null, 'a', 'b', 0); +insert into t1 values(null, 'c', 'b', 0); +insert into t1 values(null, 'a', 'd', 0); +insert into t1 values(null, 'ccc', 'qqq', 0); +insert into t1 (c2,c3) select c2,c3 from t1 where c2 != 'a'; +insert into t1 (c2,c3) select c2,c3 from t1 where c2 != 'a'; +insert into t1 (c2,c3) select c2,c3 from t1 where c2 != 'a'; +insert into t1 (c2,c3) select c2,c3 from t1 where c2 != 'a'; +insert into t1 (c2,c3) select c2,c3 from t1 where c2 != 'a'; +insert into t1 (c2,c3) select c2,c3 from t1 where c2 != 'a'; +insert into t1 (c2,c3) select c2,c3 from t1 where c2 != 'a'; +insert into t1 (c2,c3,c4) select c2,c3,1 from t1 where c2 != 'a'; +insert into t1 (c2,c3,c4) select c2,c3,2 from t1 where c2 != 'a'; +insert into t1 (c2,c3,c4) select c2,c3,3 from t1 where c2 != 'a'; +insert into t1 (c2,c3,c4) select c2,c3,4 from t1 where c2 != 'a'; +analyze table t1; +Table Op Msg_type Msg_text +test.t1 analyze status OK +select count(*) from t1 where (c2='e' OR c3='q'); +count(*) +0 +select count(*) from t1 where c4 != 0; +count(*) +3840 +explain +select distinct c1 from t1 where (c2='e' OR c3='q'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index_merge k1,k2 k1,k2 21,21 NULL 2 Using union(k1,k2); Using where +explain +select distinct c1 from t1 where (c4!= 0) AND (c2='e' OR c3='q'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index_merge k1,k2,k3 k1,k2 21,21 NULL 2 Using union(k1,k2); Using where +drop table t1; +create table t1 ( +id int unsigned auto_increment primary key, +c1 char(12), +c2 char(15), +c3 char(1) +); +insert into t1 (c3) values ('1'), ('2'); +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +update t1 set c1=lpad(id+1000, 12, ' '), c2=lpad(id+10000, 15, ' '); +alter table t1 add unique index (c1), add unique index (c2), add index (c3); +analyze table t1; +Table Op Msg_type Msg_text +test.t1 analyze status OK +explain +select * from t1 where (c1=' 100000' or c2=' 2000000'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index_merge c1,c2 c1,c2 13,16 NULL 2 Using union(c1,c2); Using where +explain +select * from t1 where (c1=' 100000' or c2=' 2000000') and c3='2'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index_merge c1,c2,c3 c1,c2 13,16 NULL 2 Using union(c1,c2); Using where +select * from t1 where (c1=' 100000' or c2=' 2000000'); +id c1 c2 c3 +select * from t1 where (c1=' 100000' or c2=' 2000000') and c3='2'; +id c1 c2 c3 +drop table t1; +SET SESSION STORAGE_ENGINE=DEFAULT; === added file 'mysql-test/t/range_vs_index_merge.test' --- a/mysql-test/t/range_vs_index_merge.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/t/range_vs_index_merge.test 2009-10-12 04:59:34 +0000 @@ -0,0 +1,805 @@ +--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 + +# The following 4 queries are added for code coverage + +EXPLAIN +SELECT * FROM City + WHERE (Population >= 100000 OR Name LIKE 'P%' OR Population < 100000); + +EXPLAIN +SELECT * FROM City + WHERE (Population >= 100000 OR Name LIKE 'P%') AND Country='CAN' OR + (Population < 100000 OR Name Like 'T%') AND Country='ARG'; + +EXPLAIN +SELECT * FROM City + WHERE Population < 200000 AND Name LIKE 'P%' AND + (Population > 300000 OR Name LIKE 'T%') AND + (Population < 100000 OR Name LIKE 'Pa%'); + +EXPLAIN +SELECT * FROM City + WHERE Population > 100000 AND Name LIKE 'Aba%' OR + Country IN ('CAN', 'ARG') AND ID < 3800 OR + Country < 'U' AND Name LIKE 'Zhu%' OR + ID BETWEEN 3800 AND 3810; + +# The output of the next 3 commands tells us about selectivities +# of the conditions utilized in 2 queries following after them + +EXPLAIN +SELECT * FROM City + WHERE (Population > 101000 AND Population < 115000); + +EXPLAIN +SELECT * FROM City + WHERE (Population > 101000 AND Population < 103000); + +EXPLAIN +SELECT * FROM City + WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F')); + +# The pattern of the WHERE condition used in the following 2 queries is +# (range(key1) OR range(key2)) AND range(key3) +# Varying values of the constants in the second conjunct of the condition +# we can get either a plan with range index scan for key3 or a plan with +# an index merge retrieval over key2 and key3 + +EXPLAIN +SELECT * FROM City + WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F')) + AND (Population > 101000 AND Population < 115000); + +EXPLAIN +SELECT * FROM City + WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F')) + AND (Population > 101000 AND Population < 103000); + +# The following 4 queries check that the plans +# for the previous 2 plans are valid + +SELECT * FROM City USE INDEX () + WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F')) + AND (Population > 101000 AND Population < 115000); + +SELECT * FROM City + WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F')) + AND (Population > 101000 AND Population < 115000); + +SELECT * FROM City USE INDEX () + WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F')) + AND (Population > 101000 AND Population < 103000); + +SELECT * FROM City + WHERE ((Name > 'Ca' AND Name < 'Cf') OR (Country > 'E' AND Country < 'F')) + AND (Population > 101000 AND Population < 103000); + +# The output of the next 7 commands tells us about selectivities +# of the conditions utilized in 4 queries following after them + +EXPLAIN +SELECT * FROM City WHERE (Name < 'Ac'); +EXPLAIN +SELECT * FROM City WHERE (Name < 'C'); +EXPLAIN +SELECT * FROM City WHERE (Country > 'A' AND Country < 'B'); +EXPLAIN +SELECT * FROM City WHERE (Name BETWEEN 'P' AND 'Pb'); +EXPLAIN +SELECT * FROM City WHERE (Name BETWEEN 'P' AND 'T'); +EXPLAIN +SELECT * FROM City WHERE (Population > 101000 AND Population < 110000); +EXPLAIN +SELECT * FROM City WHERE (Population > 103000 AND Population < 104000); + +# The pattern of the WHERE condition used in the following 4 queries is +# (range1(key1) AND range(key2)) OR (range2(key1) AND range(key3) +# Varying values of the constants in the range conjuncts of the condition +# we can get: +# 1. a plan with range index over key1 +# index merge retrievals over: +# 2. key1 and key3 +# 3. key2 and key1 +# 4. key2 and key3 + +EXPLAIN +SELECT * FROM City + WHERE (Name < 'Ac' AND (Country > 'A' AND Country < 'B')) OR + (Name BETWEEN 'P' AND 'Pb' AND (Population > 101000 AND Population < 110000)); + +EXPLAIN +SELECT * FROM City + WHERE (Name < 'Ac' AND (Country > 'A' AND Country < 'B')) OR + (Name BETWEEN 'P' AND 'T' AND (Population > 103000 AND Population < 104000)); + +EXPLAIN +SELECT * FROM City + WHERE (Name < 'C' AND (Country > 'A' AND Country < 'B')) OR + (Name BETWEEN 'P' AND 'Pb' AND (Population > 101000 AND Population < 110000)); + +EXPLAIN +SELECT * FROM City + WHERE (Name < 'C' AND (Country > 'A' AND Country < 'B')) OR + (Name BETWEEN 'P' AND 'T' AND (Population > 103000 AND Population < 104000)); + +# The following 8 queries check that the plans +# for the previous 4 plans are valid + +SELECT * FROM City USE INDEX () + WHERE (Name < 'Ac' AND (Country > 'A' AND Country < 'B')) OR + (Name BETWEEN 'P' AND 'Pb' AND (Population > 101000 AND Population < 110000)); + +SELECT * FROM City + WHERE (Name < 'Ac' AND (Country > 'A' AND Country < 'B')) OR + (Name BETWEEN 'P' AND 'Pb' AND (Population > 101000 AND Population < 110000)); + +SELECT * FROM City USE INDEX () + WHERE (Name < 'Ac' AND (Country > 'A' AND Country < 'B')) OR + (Name BETWEEN 'P' AND 'T' AND (Population > 103000 AND Population < 104000)); + +SELECT * FROM City + WHERE (Name < 'Ac' AND (Country > 'A' AND Country < 'B')) OR + (Name BETWEEN 'P' AND 'T' AND (Population > 103000 AND Population < 104000)); + +SELECT * FROM City USE INDEX () + WHERE (Name < 'C' AND (Country > 'A' AND Country < 'B')) OR + (Name BETWEEN 'P' AND 'Pb' AND (Population > 101000 AND Population < 110000)); + +SELECT * FROM City + WHERE (Name < 'C' AND (Country > 'A' AND Country < 'B')) OR + (Name BETWEEN 'P' AND 'Pb' AND (Population > 101000 AND Population < 110000)); + +SELECT * FROM City USE INDEX () + WHERE (Name < 'C' AND (Country > 'A' AND Country < 'B')) OR + (Name BETWEEN 'P' AND 'T' AND (Population > 103000 AND Population < 104000)); + +SELECT * FROM City + WHERE (Name < 'C' AND (Country > 'A' AND Country < 'B')) OR + (Name BETWEEN 'P' AND 'T' AND (Population > 103000 AND Population < 104000)); + + +# The output of the next 6 commands tells us about selectivities +# of the conditions utilized in 3 queries following after them + +EXPLAIN +SELECT * FROM City WHERE (ID < 50) OR (ID BETWEEN 100 AND 110); +EXPLAIN +SELECT * FROM City WHERE (ID < 200) OR (ID BETWEEN 300 AND 600); +EXPLAIN +SELECT * FROM City WHERE (ID < 600) OR (ID BETWEEN 900 AND 1800); +EXPLAIN +SELECT * FROM City WHERE Country > 'A' AND Country < 'ARG'; +EXPLAIN +SELECT * FROM City WHERE Name LIKE 'H%' OR Name LIKE 'P%' ; +EXPLAIN +SELECT * FROM City WHERE Name LIKE 'Ha%' OR Name LIKE 'Pa%' ; + +# The pattern of the WHERE condition used in the following 3 queries is +# (range1(key1) AND (range1(key2) OR range(key3)) OR +# (range2(key1) AND (range2(key2) OR range(key4)) +# Varying values of the constants in the range predicates of the condition +# we can get: +# 1. a plan with range index over key1 +# 2. an index merge retrieval over key1, key2 and key3 + +EXPLAIN +SELECT * FROM City + WHERE ((ID < 50) 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))); + +EXPLAIN +SELECT * FROM City + WHERE ((ID < 800) AND (Name LIKE 'Ha%' OR (Country > 'A' AND Country < 'ARG'))) + OR ((ID BETWEEN 900 AND 1800) AND + (Name LIKE 'Pa%' OR (Population > 103000 AND Population < 104000))); + +EXPLAIN +SELECT * FROM City + 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))); + + +# The following 6 queries check that the plans +# 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'))) + 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'))) + OR ((ID BETWEEN 100 AND 110) AND + (Name LIKE 'P%' OR (Population > 103000 AND Population < 104000))); + +SELECT * FROM City USE INDEX() + WHERE ((ID < 800) AND (Name LIKE 'Ha%' OR (Country > 'A' AND Country < 'ARG'))) + OR ((ID BETWEEN 900 AND 1800) AND + (Name LIKE 'Pa%' OR (Population > 103000 AND Population < 104000))); + +SELECT * FROM City + WHERE ((ID < 800) AND (Name LIKE 'Ha%' OR (Country > 'A' AND Country < 'ARG'))) + OR ((ID BETWEEN 900 AND 1800) AND + (Name LIKE 'Pa%' OR (Population > 103000 AND Population < 104000))); + +SELECT * FROM City USE INDEX () + 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))); + +SELECT * FROM City + 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))); + + +# The output of the next 8 commands tells us about selectivities +# of the conditions utilized in 2 queries following after them + +EXPLAIN +SELECT * FROM City WHERE Population > 101000 AND Population < 102000; +EXPLAIN +SELECT * FROM City WHERE Population > 101000 AND Population < 110000; +EXPLAIN +SELECT * FROM City WHERE Country < 'C'; +EXPLAIN +SELECT * FROM City WHERE Country < 'AGO'; +EXPLAIN +SELECT * FROM City WHERE Name BETWEEN 'P' AND 'T'; +EXPLAIN +SELECT * FROM City WHERE Name BETWEEN 'P' AND 'Pb'; +EXPLAIN +SELECT * FROM City WHERE ID BETWEEN 3400 AND 3800; +EXPLAIN +SELECT * FROM City WHERE ID BETWEEN 3790 AND 3800; +EXPLAIN +SELECT * FROM City WHERE Name LIKE 'P%'; + +# The pattern of the WHERE condition used in the following 2 queries is +# (range(key1) AND (range1(key2) OR range1(key3)) OR +# (range(key4) AND (range2(key2) OR range2(key3)) +# Varying values of the constants in the range predicates of the condition +# we can get: +# index merge retrievals over: +# 1. key1, key2 and key3 +# 2. key4, key2 and key3 + +EXPLAIN +SELECT * FROM City + WHERE ((Population > 101000 AND Population < 102000) AND + (Country < 'C' OR Name BETWEEN 'P' AND 'T')) OR + ((ID BETWEEN 3400 AND 3800) AND + (Country < 'AGO' OR Name LIKE 'Pa%')); + +EXPLAIN +SELECT * FROM City + WHERE ((Population > 101000 AND Population < 110000) AND + (Country < 'AGO' OR Name BETWEEN 'P' AND 'Pb')) OR + ((ID BETWEEN 3790 AND 3800) AND + (Country < 'C' OR Name LIKE 'P%')); + +# The following 4 queries check that the plans +# for the previous 2 plans are valid + +SELECT * FROM City USE INDEX () + WHERE ((Population > 101000 AND Population < 102000) AND + (Country < 'C' OR Name BETWEEN 'P' AND 'T')) OR + ((ID BETWEEN 3400 AND 3800) AND + (Country < 'AGO' OR Name LIKE 'Pa%')); + +SELECT * FROM City + WHERE ((Population > 101000 AND Population < 102000) AND + (Country < 'C' OR Name BETWEEN 'P' AND 'T')) OR + ((ID BETWEEN 3400 AND 3800) AND + (Country < 'AGO' OR Name LIKE 'Pa%')); + +SELECT * FROM City USE INDEX () + WHERE ((Population > 101000 AND Population < 110000) AND + (Country < 'AGO' OR Name BETWEEN 'P' AND 'Pb')) OR + ((ID BETWEEN 3790 AND 3800) AND + (Country < 'C' OR Name LIKE 'P%')); + +SELECT * FROM City + WHERE ((Population > 101000 AND Population < 110000) AND + (Country < 'AGO' OR Name BETWEEN 'P' AND 'Pb')) OR + ((ID BETWEEN 3790 AND 3800) AND + (Country < 'C' OR Name LIKE 'P%')); + + +CREATE INDEX CountryPopulation ON City(Country,Population); + +--disable_query_log +--disable_result_log +--disable_warnings +ANALYZE TABLE City; +--enable_warnings +--enable_result_log +--enable_query_log + +# The output of the next 4 commands tells us about selectivities +# of the conditions utilized in 2 queries following after them + +EXPLAIN +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); +EXPLAIN +SELECT * FROM City WHERE Country='USA'; + +# The pattern of the WHERE condition used in the following 3 queries is +# (range(key1_p2) OR (range(key2)) AND key1_p1=c +# Varying values of the constants in the range predicates of the condition +# we can get: +# 1. a plan with range index over key1_p1 +# 2. an index merge retrieval over: key1 and key2 + +EXPLAIN +SELECT * FROM City + WHERE ((Population > 101000 AND Population < 103000) OR Name LIKE 'Pas%') + AND Country='USA'; + +EXPLAIN +SELECT * FROM City + WHERE ((Population > 101000 AND Population < 103000) OR Name LIKE 'P%') + AND Country='USA'; + +# 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%') + AND Country='USA'; + +SELECT * FROM City USE INDEX () + WHERE ((Population > 101000 AND Population < 103000) OR Name LIKE 'Pas%') + AND Country='USA'; + +SELECT * FROM City + WHERE ((Population > 101000 AND Population < 103000) OR Name LIKE 'P%') + AND Country='USA'; + +SELECT * FROM City USE INDEX () + WHERE ((Population > 101000 AND Population < 103000) OR Name LIKE 'P%') + AND Country='USA'; + + +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 + +# The output of the next 11 commands tells us about selectivities +# of the conditions utilized in 3 queries following after them + +EXPLAIN +SELECT * FROM City WHERE Country='USA'; +EXPLAIN +SELECT * FROM City WHERE Country='BRA'; +EXPLAIN +SELECT * FROM City WHERE ID BETWEEN 3790 AND 3800; +EXPLAIN +SELECT * FROM City WHERE ID BETWEEN 4025 AND 4035; +EXPLAIN +SELECT * FROM City WHERE ID BETWEEN 4028 AND 4032; +EXPLAIN +SELECT * FROM City WHERE ID BETWEEN 3500 AND 3800; +EXPLAIN +SELECT * FROM City WHERE ID BETWEEN 4000 AND 4300; +EXPLAIN +SELECT * FROM City WHERE ID BETWEEN 250 and 260 ; +EXPLAIN +SELECT * FROM City WHERE (Population > 101000 AND Population < 102000); +EXPLAIN +SELECT * FROM City WHERE (Population > 101000 AND Population < 103000); +EXPLAIN +SELECT * FROM City WHERE Name LIKE 'Pa%'; + +# The pattern of the WHERE condition used in the following 3 queries is +# (range(key1_p2) OR range1(key3)) AND +# range(key1|2_p1=c) AND +# (range(key2_p2) OR range2(key3)) +# Varying values of the constants in the range conjuncts of the condition +# we can get: +# 1. a plan with range index over key1|2_p1 +# index merge retrievals over: +# 2. key1 and key3 +# 3. key2 and key3 + +EXPLAIN +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); + +EXPLAIN +SELECT * FROM City + WHERE ((Population > 101000 AND Population < 103000) OR + ID BETWEEN 3790 AND 3800) AND Country='USA' + AND (Name LIKE 'Pa%' OR ID BETWEEN 4028 AND 4032); + +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); + +# The following 6 queries check that the plans +# for the previous 3 plans are valid + +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); + +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); + +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 4028 AND 4032); + +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 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); + +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); + + +# The pattern of the WHERE condition used in the following query is +# (range(key1_p2) OR range1(key3)) AND range(key1|2_p1=c1) AND +# (range(key2_p2) OR range1(key3)) AND range(key1|2_p1=c2) +# We get an index merge retrieval over key1, key2 and key3 for it + +EXPLAIN +SELECT * FROM City + WHERE ((Population > 101000 and Population < 102000) OR + ID BETWEEN 3790 AND 3800) AND Country='USA' + OR (Name LIKE 'Pa%' OR ID BETWEEN 250 AND 260) AND Country='BRA'; + +# The following 2 queries check that the plans +# for the previous plan is valid + +SELECT * FROM City USE INDEX () + WHERE ((Population > 101000 and Population < 102000) OR + ID BETWEEN 3790 AND 3800) AND Country='USA' + OR (Name LIKE 'Pa%' OR ID BETWEEN 250 AND 260) AND Country='BRA'; + +SELECT * FROM City + WHERE ((Population > 101000 and Population < 102000) OR + ID BETWEEN 3790 AND 3800) AND Country='USA' + OR (Name LIKE 'Pa%' OR ID BETWEEN 250 AND 260) AND Country='BRA'; + +# The pattern of the WHERE condition used in the following query is +# (impossible_range(key1_p2) OR range1(key3)) AND +# range(key1|2_p1=c1) AND +# (range(key2_p2) OR range2(key3)) +# where range1(key3) and range2(key3) are disjoint +# Varying values of the constant in range predicates we get plans: +# 1. with an index scan over key2 +# 2. with an index scan over key4=key2_p2 + +EXPLAIN +SELECT * FROM City + WHERE ((Population > 101000 AND Population < 11000) OR + ID BETWEEN 3500 AND 3800) AND Country='USA' + AND (Name LIKE 'P%' OR ID BETWEEN 4000 AND 4300); + +EXPLAIN +SELECT * FROM City + WHERE ((Population > 101000 AND Population < 11000) OR + ID BETWEEN 3500 AND 3800) AND Country='USA' + AND (Name LIKE 'Pho%' OR ID BETWEEN 4000 AND 4300); + +# The following 4 queries check that the plans +# for the previous 2 plans are valid + +SELECT * FROM City USE INDEX () + WHERE ((Population > 101000 AND Population < 11000) OR + ID BETWEEN 3500 AND 3800) AND Country='USA' + AND (Name LIKE 'P%' OR ID BETWEEN 4000 AND 4300); + +SELECT * FROM City + WHERE ((Population > 101000 AND Population < 11000) OR + ID BETWEEN 3500 AND 3800) AND Country='USA' + AND (Name LIKE 'P%' OR ID BETWEEN 4000 AND 4300); + +SELECT * FROM City USE INDEX () + WHERE ((Population > 101000 AND Population < 11000) OR + ID BETWEEN 3500 AND 3800) AND Country='USA' + AND (Name LIKE 'Pho%' OR ID BETWEEN 4000 AND 4300); + +SELECT * FROM City + WHERE ((Population > 101000 AND Population < 11000) OR + ID BETWEEN 3500 AND 3800) AND Country='USA' + AND (Name LIKE 'Pho%' OR ID BETWEEN 4000 AND 4300); + + +DROP DATABASE world; + +use test; + +# +# Bug #17259: a bad range scan and a good index merge plan +# + +CREATE TABLE t1 ( + id int(10) unsigned NOT NULL auto_increment, + account_id int(10) unsigned NOT NULL, + first_name varchar(50) default NULL, + middle_name varchar(50) default NULL, + last_name varchar(100) default NULL, + home_address_1 varchar(150) default NULL, + home_city varchar(75) default NULL, + home_state char(2) default NULL, + home_postal_code varchar(50) default NULL, + home_county varchar(75) default NULL, + home_country char(3) default NULL, + work_address_1 varchar(150) default NULL, + work_city varchar(75) default NULL, + work_state char(2) default NULL, + work_postal_code varchar(50) default NULL, + work_county varchar(75) default NULL, + work_country char(3) default NULL, + login varchar(50) NOT NULL, + PRIMARY KEY (id), + KEY login (login,account_id), + KEY account_id (account_id), + KEY user_home_country_indx (home_country), + KEY user_work_country_indx (work_country), + KEY user_home_state_indx (home_state), + KEY user_work_state_indx (work_state), + KEY user_home_city_indx (home_city), + KEY user_work_city_indx (work_city), + KEY user_first_name_indx (first_name), + KEY user_last_name_indx (last_name) +); + +insert into t1(account_id, login, home_state, work_state) values + (1, 'pw', 'ia', 'ia'), (1, 'pw', 'ia', 'ia'), (1, 'pw', 'ia', 'ia'), + (1, 'pw', 'ia', 'ia'), (1, 'pw', 'ia', 'ia'), (1, 'pw', 'ia', 'ia'); +insert into t1(account_id, login, home_state, work_state) + select 1, 'pw', 'ak', 'ak' from t1; +insert into t1(account_id, login, home_state, work_state) + select 1, 'pw', 'ak', 'ak' from t1; +insert into t1(account_id, login, home_state, work_state) + select 1, 'pw', 'ak', 'ak' from t1; +insert into t1(account_id, login, home_state, work_state) + select 1, 'pw', 'ak', 'ak' from t1; +insert into t1(account_id, login, home_state, work_state) + select 1, 'pw', 'ak', 'ak' from t1; +insert into t1(account_id, login, home_state, work_state) + select 1, 'pw', 'ak', 'ak' from t1; +insert into t1(account_id, login, home_state, work_state) + select 1, 'pw', 'ak', 'ak' from t1; +insert into t1(account_id, login, home_state, work_state) + select 1, 'pw', 'ak', 'ak' from t1; +insert into t1(account_id, login, home_state, work_state) + select 1, 'pw', 'ak', 'ak' from t1; + +analyze table t1; + +select count(*) from t1 where account_id = 1; + +select * from t1 + where (home_state = 'ia' or work_state='ia') and account_id = 1; + +explain +select * from t1 + where (home_state = 'ia' or work_state='ia') and account_id = 1; + +drop table t1; + +# +# Bug #17673: no index merge plan if the condition for the last used +# index component is factored out of the or formula +# + +CREATE TABLE t1 ( + c1 int(11) NOT NULL auto_increment, + c2 decimal(10,0) default NULL, + c3 decimal(10,0) default NULL, + c4 decimal(10,0) default NULL, + c5 decimal(10,0) default NULL, + cp decimal(1,0) default NULL, + ce decimal(10,0) default NULL, + cdata char(20), + PRIMARY KEY (c1), + KEY k1 (c2,c3,cp,ce), + KEY k2 (c4,c5,cp,ce) +); + +insert into t1 (c2, c3, c4, c5, cp) values(1,1,1,1,1); +insert into t1 (c2, c3, c4, c5, cp) values(2,1,1,1,4); +insert into t1 (c2, c3, c4, c5, cp) values(2,1,2,1,1); +insert into t1 (c2, c3, c4, c5, cp) values(2,1,3,1,4); +insert into t1 (c2, c3, c4, c5, cp) values(3,1,4,1,4); + +insert into t1 (c2, c3, c4, c5, cp) + select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) + select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) + select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) + select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) + select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) + select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) + select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) + select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) + select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) + select c2, c3, c4, c5, cp from t1 where cp = 4; +insert into t1 (c2, c3, c4, c5, cp) + select c2, c3, c4, c5, cp from t1 where cp = 4; + +analyze table t1; + +explain + select * from t1 where (c2=1 and c3=1) or (c4=2 and c5=1); + +explain + select * from t1 + where (c2=1 and c3=1 and cp=1) or (c4=2 and c5=1 and cp=1); + +explain + select * from t1 + where ((c2=1 and c3=1) or (c4=2 and c5=1)) and cp=1; + +select * from t1 + where (c2=1 and c3=1 and cp=1) or (c4=2 and c5=1 and cp=1); + +select * from t1 + where ((c2=1 and c3=1) or (c4=2 and c5=1)) and cp=1; + +drop table t1; + +# +# Bug #23322: a bad range scan and a good index merge plan +# + +create table t1 ( + c1 int auto_increment primary key, + c2 char(20), + c3 char (20), + c4 int +); +alter table t1 add key k1 (c2); +alter table t1 add key k2 (c3); +alter table t1 add key k3 (c4); + +insert into t1 values(null, 'a', 'b', 0); +insert into t1 values(null, 'c', 'b', 0); +insert into t1 values(null, 'a', 'd', 0); +insert into t1 values(null, 'ccc', 'qqq', 0); + +insert into t1 (c2,c3) select c2,c3 from t1 where c2 != 'a'; +insert into t1 (c2,c3) select c2,c3 from t1 where c2 != 'a'; +insert into t1 (c2,c3) select c2,c3 from t1 where c2 != 'a'; +insert into t1 (c2,c3) select c2,c3 from t1 where c2 != 'a'; +insert into t1 (c2,c3) select c2,c3 from t1 where c2 != 'a'; +insert into t1 (c2,c3) select c2,c3 from t1 where c2 != 'a'; +insert into t1 (c2,c3) select c2,c3 from t1 where c2 != 'a'; + +insert into t1 (c2,c3,c4) select c2,c3,1 from t1 where c2 != 'a'; +insert into t1 (c2,c3,c4) select c2,c3,2 from t1 where c2 != 'a'; +insert into t1 (c2,c3,c4) select c2,c3,3 from t1 where c2 != 'a'; +insert into t1 (c2,c3,c4) select c2,c3,4 from t1 where c2 != 'a'; + +analyze table t1; + +select count(*) from t1 where (c2='e' OR c3='q'); +select count(*) from t1 where c4 != 0; + +explain + select distinct c1 from t1 where (c2='e' OR c3='q'); + +explain + select distinct c1 from t1 where (c4!= 0) AND (c2='e' OR c3='q'); + +drop table t1; + +# +# Bug #30151: a bad range scan and a good index merge plan +# + +create table t1 ( + id int unsigned auto_increment primary key, + c1 char(12), + c2 char(15), + c3 char(1) +); + +insert into t1 (c3) values ('1'), ('2'); + +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; +insert into t1 (c3) select c3 from t1; + +update t1 set c1=lpad(id+1000, 12, ' '), c2=lpad(id+10000, 15, ' '); + +alter table t1 add unique index (c1), add unique index (c2), add index (c3); + +analyze table t1; + +explain + select * from t1 where (c1=' 100000' or c2=' 2000000'); +explain + select * from t1 where (c1=' 100000' or c2=' 2000000') and c3='2'; + +select * from t1 where (c1=' 100000' or c2=' 2000000'); +select * from t1 where (c1=' 100000' or c2=' 2000000') and c3='2'; + +drop table t1; + + + + + === added file 'mysql-test/t/range_vs_index_merge_innodb.test' --- a/mysql-test/t/range_vs_index_merge_innodb.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/t/range_vs_index_merge_innodb.test 2009-10-12 04:59:34 +0000 @@ -0,0 +1,7 @@ +--source include/have_innodb.inc + +SET SESSION STORAGE_ENGINE='InnoDB'; + +--source t/range_vs_index_merge.test + +SET SESSION STORAGE_ENGINE=DEFAULT; === modified file 'sql/opt_range.cc' --- a/sql/opt_range.cc 2009-09-09 21:59:28 +0000 +++ b/sql/opt_range.cc 2009-10-12 04:59:34 +0000 @@ -497,6 +497,11 @@ public: pos->increment_use_count(count); } } + void incr_refs() + { + increment_use_count(1); + use_count++; + } void free_tree() { for (SEL_ARG *pos=first(); pos ; pos=pos->next) @@ -558,7 +563,100 @@ public: class SEL_IMERGE; +#define CLONE_KEY1_MAYBE 1 +#define CLONE_KEY2_MAYBE 2 +#define swap_clone_flag(A) ((A & 1) << 1) | ((A & 2) >> 1) + +/* + While objects of the class SEL_ARG represent ranges for indexes or + index infixes (including ranges for index prefixes and index suffixes), + objects of the class SEL_TREE represent AND/OR formulas of such ranges. + Currently an AND/OR formula represented by a SEL_TREE object can have + at most three levels: + + <SEL_TREE formula> ::= + [ <SEL_RANGE_TREE formula> AND ] + [ <SEL_IMERGE formula> [ AND <SEL_IMERGE formula> ...] ] + + <SEL_RANGE_TREE formula> ::= + <SEL_ARG formula> [ AND <SEL_ARG_formula> ... ] + + <SEL_IMERGE formula> ::= + <SEL_RANGE_TREE formula> [ OR <SEL_RANGE_TREE formula> ] + + As we can see from the above definitions: + - SEL_RANGE_TREE formula is a conjunction of SEL_ARG formulas + - SEL_IMERGE formula is a disjunction of SEL_RANGE_TREE formulas + - SEL_TREE formula is a conjunction of a SEL_RANGE_TREE formula + and SEL_IMERGE formulas. + It's required above that a SEL_TREE formula has at least one conjunct. + + Usually we will consider normalized SEL_RANGE_TREE formulas where we use + TRUE as conjunct members for those indexes whose SEL_ARG trees are empty. + + We will call an SEL_TREE object simply 'tree'. + The part of a tree that represents SEL_RANGE_TREE formula is called + 'range part' of the tree while the remaining part is called 'imerge part'. + If a tree contains only a range part then we call such a tree 'range tree'. + Components of a range tree that represent SEL_ARG formulas are called ranges. + If a tree does not contain any range part we call such a tree 'imerge tree'. + Components of the imerge part of a tree that represent SEL_IMERGE formula + are called imerges. + + Usually we'll designate: + SEL_TREE formulas by T_1,...,T_k + SEL_ARG formulas by R_1,...,R_k + SEL_RANGE_TREE formulas by RT_1,...,RT_k + SEL_IMERGE formulas by M_1,...,M_k + Accordingly we'll use: + t_1,...,t_k - to designate trees representing T_1,...,T_k + r_1,...,r_k - to designate ranges representing R_1,...,R_k + rt_1,...,r_tk - to designate range trees representing RT_1,...,RT_k + m_1,...,m_k - to designate imerges representing M_1,...,M_k + + SEL_TREE objects are usually built from WHERE conditions or + ON expressions. + A SEL_TREE object always represents an inference of the condition it is + built from. Therefore, if a row satisfies a SEL_TREE formula it also + satisfies the condition it is built from. + + The following transformations of tree t representing SEL_TREE formula T + yield a new tree t1 thar represents an inference of T: T=>T1. + (1) remove any of SEL_ARG tree from the range part of t + (2) remove any imerge from the tree t + (3) remove any of SEL_ARG tree from any range tree contained + in any imerge of tree + + Since the basic blocks of any SEL_TREE objects are ranges, SEL_TREE + objects in many cases can be effectively used to filter out a big part + of table rows that do not satisfy WHERE/IN conditions utilizing + only single or multiple range index scans. + + A single range index scan is constructed for a range tree that contains + only one SEL_ARG object for an index or an index prefix. + An index intersection scan can be constructed for a range tree + that contains several SEL_ARG objects. Currently index intersection + scans are constructed only for single-point ranges. + An index merge scan is constructed for a imerge tree that contains only + one imerge. If range trees of this imerge contain only single-point merges + than a union of index intersections can be built. + + Usually the tree built by the range optimizer for a query table contains + more than one range in the range part, and additionally may contain some + imerges in the imerge part. The range optimizer evaluates all of them one + by one and chooses the range or the imerge that provides the cheapest + single or multiple range index scan of the table. According to rules + (1)-(3) this scan always filter out only those rows that do not satisfy + the query conditions. + + For any condition the SEL_TREE object for it is built in a bottom up + manner starting from the range trees for the predicates. The tree_and + function builds a tree for any conjunction of formulas from the trees + for its conjuncts. The tree_or function builds a tree for any disjunction + of formulas from the trees for its disjuncts. +*/ + class SEL_TREE :public Sql_alloc { public: @@ -574,7 +672,7 @@ public: keys_map.clear_all(); bzero((char*) keys,sizeof(keys)); } - SEL_TREE(SEL_TREE *arg, RANGE_OPT_PARAM *param); + SEL_TREE(SEL_TREE *arg, bool without_merges, RANGE_OPT_PARAM *param); /* Note: there may exist SEL_TREE objects with sel_tree->type=KEY and keys[i]=0 for all i. (SergeyP: it is not clear whether there is any @@ -597,6 +695,9 @@ public: struct st_ror_scan_info **ror_scans; /* list of ROR key scans */ struct st_ror_scan_info **ror_scans_end; /* last ROR scan */ /* Note that #records for each key scan is stored in table->quick_rows */ + + bool without_ranges() { return keys_map.is_clear_all(); } + bool without_imerges() { return merges.is_empty(); } }; class RANGE_OPT_PARAM @@ -642,6 +743,7 @@ class PARAM : public RANGE_OPT_PARAM { public: KEY_PART *key[MAX_KEY]; /* First key parts of keys used in the query */ + ha_rows quick_rows[MAX_KEY]; longlong baseflag; uint max_key_part, range_count; @@ -669,7 +771,7 @@ class TABLE_READ_PLAN; class TRP_RANGE; class TRP_ROR_INTERSECT; class TRP_ROR_UNION; - class TRP_ROR_INDEX_MERGE; + class TRP_INDEX_MERGE; class TRP_GROUP_MIN_MAX; struct st_ror_scan_info; @@ -708,6 +810,10 @@ static TABLE_READ_PLAN *get_best_disjunct_quick(PARAM *param, SEL_IMERGE *imerge, double read_time); static +TABLE_READ_PLAN *merge_same_index_scans(PARAM *param, SEL_IMERGE *imerge, + TRP_INDEX_MERGE *imerge_trp, + double read_time); +static TRP_GROUP_MIN_MAX *get_best_group_min_max(PARAM *param, SEL_TREE *tree); static double get_index_only_read_time(const PARAM* param, ha_rows records, int keynr); @@ -721,11 +827,15 @@ static void print_ror_scans_arr(TABLE *t static void print_quick(QUICK_SELECT_I *quick, const key_map *needed_reg); #endif -static SEL_TREE *tree_and(RANGE_OPT_PARAM *param,SEL_TREE *tree1,SEL_TREE *tree2); -static SEL_TREE *tree_or(RANGE_OPT_PARAM *param,SEL_TREE *tree1,SEL_TREE *tree2); +static SEL_TREE *tree_and(RANGE_OPT_PARAM *param, + SEL_TREE *tree1, SEL_TREE *tree2); +static SEL_TREE *tree_or(RANGE_OPT_PARAM *param, + SEL_TREE *tree1,SEL_TREE *tree2); static SEL_ARG *sel_add(SEL_ARG *key1,SEL_ARG *key2); -static SEL_ARG *key_or(RANGE_OPT_PARAM *param, SEL_ARG *key1, SEL_ARG *key2); -static SEL_ARG *key_and(RANGE_OPT_PARAM *param, SEL_ARG *key1, SEL_ARG *key2, +static SEL_ARG *key_or(RANGE_OPT_PARAM *param, + SEL_ARG *key1, SEL_ARG *key2); +static SEL_ARG *key_and(RANGE_OPT_PARAM *param, + SEL_ARG *key1, SEL_ARG *key2, uint clone_flag); static bool get_range(SEL_ARG **e1,SEL_ARG **e2,SEL_ARG *root1); bool get_quick_keys(PARAM *param,QUICK_RANGE_SELECT *quick,KEY_PART *key, @@ -736,22 +846,24 @@ static bool eq_tree(SEL_ARG* a,SEL_ARG * static SEL_ARG null_element(SEL_ARG::IMPOSSIBLE); static bool null_part_in_key(KEY_PART *key_part, const uchar *key, uint length); -bool sel_trees_can_be_ored(SEL_TREE *tree1, SEL_TREE *tree2, RANGE_OPT_PARAM* param); +static bool sel_trees_have_common_keys(RANGE_OPT_PARAM* param, + SEL_TREE *tree1, SEL_TREE *tree2, + key_map *common_keys); +static void eliminate_single_tree_imerges(RANGE_OPT_PARAM *param, + SEL_TREE *tree); + +static bool sel_trees_can_be_ored(RANGE_OPT_PARAM* param, + SEL_TREE *tree1, SEL_TREE *tree2, + key_map *common_keys); +static bool sel_trees_must_be_ored(RANGE_OPT_PARAM* param, + SEL_TREE *tree1, SEL_TREE *tree2, + key_map common_keys); +static int and_range_trees(RANGE_OPT_PARAM *param, + SEL_TREE *tree1, SEL_TREE *tree2, + SEL_TREE *result); +static bool remove_nonrange_trees(RANGE_OPT_PARAM *param, SEL_TREE *tree); -/* - SEL_IMERGE is a list of possible ways to do index merge, i.e. it is - a condition in the following form: - (t_1||t_2||...||t_N) && (next) - - where all t_i are SEL_TREEs, next is another SEL_IMERGE and no pair - (t_i,t_j) contains SEL_ARGS for the same index. - - SEL_TREE contained in SEL_IMERGE always has merges=NULL. - - This class relies on memory manager to do the cleanup. -*/ - class SEL_IMERGE : public Sql_alloc { enum { PREALLOCED_TREES= 10}; @@ -768,23 +880,37 @@ public: trees_next(trees), trees_end(trees + PREALLOCED_TREES) {} - SEL_IMERGE (SEL_IMERGE *arg, RANGE_OPT_PARAM *param); + SEL_IMERGE (SEL_IMERGE *arg, uint cnt, RANGE_OPT_PARAM *param); int or_sel_tree(RANGE_OPT_PARAM *param, SEL_TREE *tree); - int or_sel_tree_with_checks(RANGE_OPT_PARAM *param, SEL_TREE *new_tree); - int or_sel_imerge_with_checks(RANGE_OPT_PARAM *param, SEL_IMERGE* imerge); + bool have_common_keys(RANGE_OPT_PARAM *param, SEL_TREE *tree); + int and_sel_tree(RANGE_OPT_PARAM *param, SEL_TREE *tree, + SEL_IMERGE *new_imerge); + int or_sel_tree_with_checks(RANGE_OPT_PARAM *param, + SEL_TREE *new_tree, + bool is_first_check_pass, + bool *is_last_check_pass); + int or_sel_imerge_with_checks(RANGE_OPT_PARAM *param, + SEL_IMERGE* imerge, + bool is_first_check_pass, + bool *is_last_check_pass); }; /* - Add SEL_TREE to this index_merge without any checks, + Add a range tree to the range trees of this imerge - NOTES - This function implements the following: - (x_1||...||x_N) || t = (x_1||...||x_N||t), where x_i, t are SEL_TREEs + SYNOPSIS + or_sel_tree() + param Context info for the operation + tree SEL_TREE to add to this imerge + + DESCRIPTION + The function just adds the range tree 'tree' to the range trees + of this imerge. RETURN - 0 - OK - -1 - Out of memory. + 0 if the operation is success + -1 if the function runs out memory */ int SEL_IMERGE::or_sel_tree(RANGE_OPT_PARAM *param, SEL_TREE *tree) @@ -809,96 +935,294 @@ int SEL_IMERGE::or_sel_tree(RANGE_OPT_PA /* - Perform OR operation on this SEL_IMERGE and supplied SEL_TREE new_tree, - combining new_tree with one of the trees in this SEL_IMERGE if they both - have SEL_ARGs for the same key. + Check if any of the range trees of this imerge intersects with a given tree SYNOPSIS - or_sel_tree_with_checks() - param PARAM from SQL_SELECT::test_quick_select - new_tree SEL_TREE with type KEY or KEY_SMALLER. + have_common_keys() + param Context info for the function + tree SEL_TREE intersection with the imerge range trees is checked for - NOTES - This does the following: - (t_1||...||t_k)||new_tree = - either - = (t_1||...||t_k||new_tree) - or - = (t_1||....||(t_j|| new_tree)||...||t_k), + DESCRIPTION + The function checks whether there is any range tree rt_i in this imerge + such that there are some indexes for which ranges are defined in both + rt_i and the range part of the SEL_TREE tree. + To check this the function calls the function sel_trees_have_common_keys. - where t_i, y are SEL_TREEs. - new_tree is combined with the first t_j it has a SEL_ARG on common - key with. As a consequence of this, choice of keys to do index_merge - read may depend on the order of conditions in WHERE part of the query. + RETURN + TRUE if there are such range trees in this imerge + FALSE otherwise +*/ + +bool SEL_IMERGE::have_common_keys(RANGE_OPT_PARAM *param, SEL_TREE *tree) +{ + for (SEL_TREE** or_tree= trees, **bound= trees_next; + or_tree != bound; or_tree++) + { + key_map common_keys; + if (sel_trees_have_common_keys(param, *or_tree, tree, &common_keys)) + return TRUE; + } + return FALSE; +} + + +/* + Perform AND operation for this imerge and the range part of a tree + + SYNOPSIS + and_sel_tree() + param Context info for the operation + tree SEL_TREE for the second operand of the operation + new_imerge OUT imerge for the result of the operation + DESCRIPTION + This function performs AND operation for this imerge m and the + range part of the SEL_TREE tree rt. In other words the function + pushes rt into this imerge. The resulting imerge is returned in + the parameter new_imerge. + If this imerge m represent the formula + RT_1 OR ... OR RT_k + then the resulting imerge of the function represents the formula + (RT_1 AND RT) OR ... (RT_k AND RT) + The function calls the function and_range_trees to construct the + range tree representing (RT_i AND RT). + + NOTE + The function may return an empty imerge without any range trees + RETURN - 0 OK - 1 One of the trees was combined with new_tree to SEL_TREE::ALWAYS, - and (*this) should be discarded. - -1 An error occurred. + 0 if the operation is a success + -1 otherwise: there is not enough memory to perform the operation */ -int SEL_IMERGE::or_sel_tree_with_checks(RANGE_OPT_PARAM *param, SEL_TREE *new_tree) +int SEL_IMERGE::and_sel_tree(RANGE_OPT_PARAM *param, SEL_TREE *tree, + SEL_IMERGE *new_imerge) { - for (SEL_TREE** tree = trees; - tree != trees_next; - tree++) + for (SEL_TREE** or_tree= trees; or_tree != trees_next; or_tree++) { - if (sel_trees_can_be_ored(*tree, new_tree, param)) + SEL_TREE *result= 0; + key_map result_keys; + if (!(result= new SEL_TREE())) + return (-1); + if (!and_range_trees(param, *or_tree, tree, result)) { - *tree = tree_or(param, *tree, new_tree); - if (!*tree) - return 1; - if (((*tree)->type == SEL_TREE::MAYBE) || - ((*tree)->type == SEL_TREE::ALWAYS)) + if (new_imerge->or_sel_tree(param, result)) + return (-1); + } + } + return 0; +} + + +/* + Perform OR operation on this imerge and the range part of a tree + + SYNOPSIS + or_sel_tree_with_checks() + param Context info for the operation + tree SEL_TREE whose range part is to be ored + is_first_check_pass <=> the first call of the function for this imerge + is_last_check_pass OUT <=> no more calls of the function for this imerge + + DESCRIPTION + The functions performs OR operation on this imerge m and the range part + of the SEL_TREE tree rt. It always replaces this imerge with the result + of the operation. + + The operation can be performed in two different modes: with + is_first_check_pass==TRUE and is_first_check_pass==FALSE, transforming + this imerge differently. + + Given this imerge represents the formula + RT_1 OR ... OR RT_k: + + 1. In the first mode, when is_first_check_pass==TRUE : + 1.1. If rt must be ored(see the function sel_trees_must_be_ored) with + some rt_j (there may be only one such range tree in the imerge) + then the function produces the imerge representing the formula + RT_1 OR ... OR (RT_j OR RT) OR ... OR RT_k, + where the tree for (RT_j OR RT) is built by oring the pairs + of SEL_ARG trees for the corresponding indexes + 1.2. Otherwise the function produces the imerge representing the formula: + RT_1 OR ... OR RT_k OR RT. + + 2. In the second mode, when is_first_check_pass==FALSE : + 2.1. For each rt_j in the imerge that can be ored (see the function + sel_trees_can_be_ored), but not must be ored, with rt the function + replaces rt_j for a range tree such that for each index for which + ranges are defined in both in rt_j and rt the tree contains the + result of oring of these ranges. + 2.2. In other cases the function does not produce any imerge. + + When is_first_check==TRUE the function returns FALSE in the parameter + is_last_check_pass if there is no rt_j such that rt_j can be ored with rt, + but, at the same time, it's not true that rt_j must be ored with rt. + When is_first_check==FALSE the function always returns FALSE in the + parameter is_last_check_pass. + + RETURN + 1 The result of oring of rt_j and rt that must be ored returns the + the range tree with type==SEL_TREE::ALWAYS + (in this case the imerge m should be discarded) + -1 The function runs out of memory + 0 in all other cases +*/ + +int SEL_IMERGE::or_sel_tree_with_checks(RANGE_OPT_PARAM *param, + SEL_TREE *tree, + bool is_first_check_pass, + bool *is_last_check_pass) +{ + *is_last_check_pass= TRUE; + for (SEL_TREE** or_tree = trees; + or_tree != trees_next; + or_tree++) + { + SEL_TREE *result= 0; + key_map result_keys; + key_map ored_keys; + if (sel_trees_can_be_ored(param, *or_tree, tree, &ored_keys)) + { + bool must_be_ored= sel_trees_must_be_ored(param, *or_tree, tree, + ored_keys); + if (must_be_ored == is_first_check_pass) { + result_keys.clear_all(); + result= *or_tree; + for (uint key_no= 0; key_no < param->keys; key_no++) + { + if (!ored_keys.is_set(key_no)) + { + result->keys[key_no]= 0; + continue; + } + SEL_ARG *key1= (*or_tree)->keys[key_no]; + SEL_ARG *key2= tree->keys[key_no]; + key2->incr_refs(); + if ((result->keys[key_no]= key_or(param, key1, key2))) + { + + result_keys.set_bit(key_no); +#ifdef EXTRA_DEBUG + if (param->alloced_sel_args < SEL_ARG::MAX_SEL_ARGS) + { + key1= result->keys[key_no]; + (key1)->test_use_count(key1); + } +#endif + } + } + } + else if(is_first_check_pass) + *is_last_check_pass= FALSE; + } + + if (result) + { + if (result_keys.is_clear_all()) + result->type= SEL_TREE::ALWAYS; + *is_last_check_pass= TRUE; + if ((result->type == SEL_TREE::MAYBE) || + (result->type == SEL_TREE::ALWAYS)) return 1; /* SEL_TREE::IMPOSSIBLE is impossible here */ - return 0; + result->keys_map= result_keys; + *or_tree= result; + if (is_first_check_pass) + return 0; } } + if (!is_first_check_pass) + return 0; - /* New tree cannot be combined with any of existing trees. */ - return or_sel_tree(param, new_tree); + if (!*is_last_check_pass && + !(tree= new SEL_TREE(tree, FALSE, param))) + return (-1); + return or_sel_tree(param, tree); } /* - Perform OR operation on this index_merge and supplied index_merge list. + Perform OR operation on this imerge and and another imerge + + SYNOPSIS + or_sel_tree_with_checks() + param Context info for the operation + imerge The second operand of the operation + is_first_check_pass <=> the first call of the function for this imerge + is_last_check_pass OUT <=> no more calls of the function for this imerge + DESCRIPTION + For each range tree rt from 'imerge' the function calls the method + SEL_IMERGE::or_sel_tree_with_checks that performs OR operation on this + SEL_IMERGE object m and the tree rt. The mode of the operation is + specified by the parameter is_first_check_pass. Each call of + SEL_IMERGE::or_sel_tree_with_checks transforms this SEL_IMERGE object m. + The function returns FALSE in the prameter is_last_check_pass if + at least one of the calls of SEL_IMERGE::or_sel_tree_with_checks + returns FALSE as the value of its last parameter. + RETURN - 0 - OK - 1 - One of conditions in result is always TRUE and this SEL_IMERGE - should be discarded. - -1 - An error occurred + 1 One of the calls of SEL_IMERGE::or_sel_tree_with_checks returns 1. + (in this case the imerge m should be discarded) + -1 The function runs out of memory + 0 in all other cases */ -int SEL_IMERGE::or_sel_imerge_with_checks(RANGE_OPT_PARAM *param, SEL_IMERGE* imerge) +int SEL_IMERGE::or_sel_imerge_with_checks(RANGE_OPT_PARAM *param, + SEL_IMERGE* imerge, + bool is_first_check_pass, + bool *is_last_check_pass) { + *is_last_check_pass= TRUE; for (SEL_TREE** tree= imerge->trees; tree != imerge->trees_next; tree++) { - if (or_sel_tree_with_checks(param, *tree)) - return 1; + uint rc; + bool is_last; + rc= or_sel_tree_with_checks(param, *tree, is_first_check_pass, &is_last); + if (!is_last) + *is_last_check_pass= FALSE; + if (rc) + return rc; } return 0; } -SEL_TREE::SEL_TREE(SEL_TREE *arg, RANGE_OPT_PARAM *param): Sql_alloc() +/* + Copy constructor for SEL_TREE objects + + SYNOPSIS + SEL_TREE + arg The source tree for the constructor + without_merges <=> only the range part of the tree arg is copied + param Context info for the operation + + DESCRIPTION + The constructor creates a full copy of the SEL_TREE arg if + the prameter without_merges==FALSE. Otherwise a tree is created + that contains the copy only of the range part of the tree arg. +*/ + +SEL_TREE::SEL_TREE(SEL_TREE *arg, bool without_merges, + RANGE_OPT_PARAM *param): Sql_alloc() { keys_map= arg->keys_map; type= arg->type; - for (int idx= 0; idx < MAX_KEY; idx++) + for (uint idx= 0; idx < param->keys; idx++) { if ((keys[idx]= arg->keys[idx])) - keys[idx]->increment_use_count(1); + keys[idx]->incr_refs(); } + if (without_merges) + return; + List_iterator<SEL_IMERGE> it(arg->merges); for (SEL_IMERGE *el= it++; el; el= it++) { - SEL_IMERGE *merge= new SEL_IMERGE(el, param); + SEL_IMERGE *merge= new SEL_IMERGE(el, 0, param); if (!merge || merge->trees == merge->trees_next) { merges.empty(); @@ -909,7 +1233,23 @@ SEL_TREE::SEL_TREE(SEL_TREE *arg, RANGE_ } -SEL_IMERGE::SEL_IMERGE (SEL_IMERGE *arg, RANGE_OPT_PARAM *param) : Sql_alloc() +/* + Copy constructor for SEL_IMERGE objects + + SYNOPSIS + SEL_IMERGE + arg The source imerge for the constructor + cnt How many trees from arg are to be copied + param Context info for the operation + + DESCRIPTION + The cnt==0 then the constructor creates a full copy of the + imerge arg. Otherwise only the first cnt trees of the imerge + are copied. +*/ + +SEL_IMERGE::SEL_IMERGE(SEL_IMERGE *arg, uint cnt, + RANGE_OPT_PARAM *param) : Sql_alloc() { uint elements= (arg->trees_end - arg->trees); if (elements > PREALLOCED_TREES) @@ -921,13 +1261,13 @@ SEL_IMERGE::SEL_IMERGE (SEL_IMERGE *arg, else trees= &trees_prealloced[0]; - trees_next= trees; + trees_next= trees + (cnt ? cnt : arg->trees_next-arg->trees); trees_end= trees + elements; - for (SEL_TREE **tree = trees, **arg_tree= arg->trees; tree < trees_end; + for (SEL_TREE **tree = trees, **arg_tree= arg->trees; tree < trees_next; tree++, arg_tree++) { - if (!(*tree= new SEL_TREE(*arg_tree, param))) + if (!(*tree= new SEL_TREE(*arg_tree, FALSE, param))) goto mem_err; } @@ -941,7 +1281,19 @@ mem_err: /* - Perform AND operation on two index_merge lists and store result in *im1. + Perform AND operation on two imerge lists + + SYNOPSIS + imerge_list_and_list() + param Context info for the operation + im1 The first imerge list for the operation + im2 The second imerge list for the operation + + DESCRIPTION + The function just appends the imerge list im2 to the imerge list im1 + + RETURN VALUE + none */ inline void imerge_list_and_list(List<SEL_IMERGE> *im1, List<SEL_IMERGE> *im2) @@ -951,73 +1303,242 @@ inline void imerge_list_and_list(List<SE /* - Perform OR operation on 2 index_merge lists, storing result in first list. - - NOTES - The following conversion is implemented: - (a_1 &&...&& a_N)||(b_1 &&...&& b_K) = AND_i,j(a_i || b_j) => - => (a_1||b_1). - - i.e. all conjuncts except the first one are currently dropped. - This is done to avoid producing N*K ways to do index_merge. + Perform OR operation on two imerge lists - If (a_1||b_1) produce a condition that is always TRUE, NULL is returned - and index_merge is discarded (while it is actually possible to try - harder). - - As a consequence of this, choice of keys to do index_merge read may depend - on the order of conditions in WHERE part of the query. + SYNOPSIS + imerge_list_or_list() + param Context info for the operation + im1 The first imerge list for the operation + im2 The second imerge list for the operation + + DESCRIPTION + Assuming that the first imerge list represents the formula + F1= M1_1 AND ... AND M1_k1 + while the second imerge list represents the formula + F2= M2_1 AND ... AND M2_k2, + where M1_i= RT1_i_1 OR ... OR RT1_i_l1i (i in [1..k1]) + and M2_i = RT2_i_1 OR ... OR RT2_i_l2i (i in [1..k2]), + the function builds a list of imerges for some formula that can be + inferred from the formula (F1 OR F2). + + More exactly the function builds imerges for the formula (M1_1 OR M2_1). + Note that + (F1 OR F2) = (M1_1 AND ... AND M1_k1) OR (M2_1 AND ... AND M2_k2) = + AND (M1_i OR M2_j) (i in [1..k1], j in [1..k2]) => + M1_1 OR M2_1. + So (M1_1 OR M2_1) is indeed an inference formula for (F1 OR F2). + + To build imerges for the formula (M1_1 OR M2_1) the function invokes, + possibly twice, the method SEL_IMERGE::or_sel_imerge_with_checks + for the imerge m1_1. + At its first invocation the method SEL_IMERGE::or_sel_imerge_with_checks + performs OR operation on the imerge m1_1 and the range tree rt2_1_1 by + calling SEL_IMERGE::or_sel_tree_with_checks with is_first_pass_check==TRUE. + The resulting imerge of the operation is ored with the next range tree of + the imerge m2_1. This oring continues until the last range tree from + m2_1 has been ored. + At its second invocation the method SEL_IMERGE::or_sel_imerge_with_checks + performs the same sequence of OR operations, but now calling + SEL_IMERGE::or_sel_tree_with_checks with is_first_pass_check==FALSE. + The imerges that the operation produces replace those in the list im1 + RETURN - 0 OK, result is stored in *im1 - other Error, both passed lists are unusable + 0 if the operation is a success + -1 if the function has run out of memory */ int imerge_list_or_list(RANGE_OPT_PARAM *param, List<SEL_IMERGE> *im1, List<SEL_IMERGE> *im2) { + + uint rc; + bool is_last_check_pass= FALSE; + SEL_IMERGE *imerge= im1->head(); + uint elems= imerge->trees_next-imerge->trees; im1->empty(); im1->push_back(imerge); - return imerge->or_sel_imerge_with_checks(param, im2->head()); + rc= imerge->or_sel_imerge_with_checks(param, im2->head(), + TRUE, &is_last_check_pass); + if (rc) + { + if (rc == 1) + { + im1->empty(); + rc= 0; + } + return rc; + } + + if (!is_last_check_pass) + { + SEL_IMERGE* new_imerge= new SEL_IMERGE(imerge, elems, param); + if (new_imerge) + { + is_last_check_pass= TRUE; + rc= new_imerge->or_sel_imerge_with_checks(param, im2->head(), + FALSE, &is_last_check_pass); + if (!rc) + im1->push_back(new_imerge); + } + } + return rc; } /* - Perform OR operation on index_merge list and key tree. + Perform OR operation for each imerge from a list and the range part of a tree + + SYNOPSIS + imerge_list_or_tree() + param Context info for the operation + merges The list of imerges to be ored with the range part of tree + tree SEL_TREE whose range part is to be ored with the imerges + + DESCRIPTION + For each imerge mi from the list 'merges' the function performes OR + operation with mi and the range part of 'tree' rt, producing one or + two imerges. + Given the merge mi represent the formula RTi_1 OR ... OR RTi_k, + the function forms the merges by the following rules: + + 1. If rt cannot be ored with any of the trees rti the function just + produces an imerge that represents the formula + RTi_1 OR ... RTi_k OR RT. + 2. If there exist a tree rtj that must be ored with rt the function + produces an imerge the represents the formula + RTi_1 OR ... OR (RTi_j OR RT) OR ... OR RTi_k, + where the range tree for (RTi_j OR RT) is constructed by oring the + SEL_ARG trees that must be ored. + 3. For each rti_j that can be ored with rt the function produces + the new tree rti_j' and substitutes rti_j for this new range tree. + + In any case the function removes mi from the list and then adds all + produced imerges. + + To build imerges by rules 1-3 the function calls the method + SEL_IMERGE::or_sel_tree_with_checks, possibly twice. With the first + call it passes TRUE for the third parameter of the function. + At this first call imerges by rules 1-2 are built. If the call + returns FALSE as the return value of its fourth parameter then the + function are called for the second time. At this call the imerge + of rule 3 is produced. + + If a call of SEL_IMERGE::or_sel_tree_with_checks returns 1 then + then it means that the produced tree contains an always true + range tree and the whole imerge can be discarded. + RETURN - 0 OK, result is stored in *im1. - other Error + 1 if no imerges are produced + 0 otherwise */ +static int imerge_list_or_tree(RANGE_OPT_PARAM *param, - List<SEL_IMERGE> *im1, + List<SEL_IMERGE> *merges, SEL_TREE *tree) { + SEL_IMERGE *imerge; - List_iterator<SEL_IMERGE> it(*im1); - bool tree_used= FALSE; + List<SEL_IMERGE> additional_merges; + List_iterator<SEL_IMERGE> it(*merges); + while ((imerge= it++)) { - SEL_TREE *or_tree; - if (tree_used) - { - or_tree= new SEL_TREE (tree, param); - if (!or_tree || - (or_tree->keys_map.is_clear_all() && or_tree->merges.is_empty())) - return FALSE; + bool is_last_check_pass; + int rc= 0; + int rc1= 0; + SEL_TREE *or_tree= new SEL_TREE (tree, FALSE, param); + if (or_tree) + { + uint elems= imerge->trees_next-imerge->trees; + rc= imerge->or_sel_tree_with_checks(param, or_tree, + TRUE, &is_last_check_pass); + if (!is_last_check_pass) + { + SEL_IMERGE *new_imerge= new SEL_IMERGE(imerge, elems, param); + if (new_imerge) + { + rc1= new_imerge->or_sel_tree_with_checks(param, or_tree, + FALSE, &is_last_check_pass); + if (!rc1) + additional_merges.push_back(new_imerge); + } + } } - else - or_tree= tree; - - if (imerge->or_sel_tree_with_checks(param, or_tree)) + if (rc || rc1 || !or_tree) it.remove(); - tree_used= TRUE; } - return im1->is_empty(); + + merges->concat(&additional_merges); + return merges->is_empty(); +} + + +/* + Perform pushdown operation of the range part of a tree into given imerges + + SYNOPSIS + imerge_list_and_tree() + param Context info for the operation + merges IN/OUT List of imerges to push the range part of 'tree' into + tree SEL_TREE whose range part is to be pushed into imerges + + DESCRIPTION + For each imerge from the list merges the function pushes the range part + rt of 'tree' into the imerge. + More exactly if the imerge mi from the list represents the formula + RTi_1 OR ... OR RTi_k + the function bulds a new imerge that represents the formula + (RTi_1 AND RT) OR ... OR (RTi_k AND RT) + and adds this imerge to the list merges. + To perform this pushdown operation the function calls the method + SEL_IMERGE::and_sel_tree. + For any imerge mi the new imerge is not created if for each pair of + trees rti_j and rt the intersection of the indexes with defined ranges + is empty. + If the result of the pushdown operation for the imerge mi returns an + imerge with no trees then then not only nothing is added to the list + merges but mi itself is removed from the list. + + RETURN + 1 if no imerges are left in the list merges + 0 otherwise +*/ + +static +int imerge_list_and_tree(RANGE_OPT_PARAM *param, + List<SEL_IMERGE> *merges, + SEL_TREE *tree) +{ + SEL_IMERGE *imerge; + SEL_IMERGE *new_imerge= NULL; + List<SEL_IMERGE> new_merges; + List_iterator<SEL_IMERGE> it(*merges); + + while ((imerge= it++)) + { + if (!new_imerge) + new_imerge= new SEL_IMERGE(); + if (imerge->have_common_keys(param, tree) && + new_imerge && !imerge->and_sel_tree(param, tree, new_imerge)) + { + if (new_imerge->trees == new_imerge->trees_next) + it.remove(); + else + { + new_merges.push_back(new_imerge); + new_imerge= NULL; + } + } + } + imerge_list_and_list(&new_merges, merges); + *merges= new_merges; + return merges->is_empty(); } @@ -2367,72 +2888,73 @@ int SQL_SELECT::test_quick_select(THD *t It is possible to use a range-based quick select (but it might be slower than 'all' table scan). */ - if (tree->merges.is_empty()) + TRP_RANGE *range_trp; + TRP_ROR_INTERSECT *rori_trp; + bool can_build_covering= FALSE; + + remove_nonrange_trees(¶m, tree); + + /* Get best 'range' plan and prepare data for making other plans */ + if ((range_trp= get_key_scans_params(¶m, tree, FALSE, TRUE, + best_read_time))) { - TRP_RANGE *range_trp; - TRP_ROR_INTERSECT *rori_trp; - bool can_build_covering= FALSE; - - /* Get best 'range' plan and prepare data for making other plans */ - if ((range_trp= get_key_scans_params(¶m, tree, FALSE, TRUE, - best_read_time))) - { - best_trp= range_trp; - best_read_time= best_trp->read_cost; - } + best_trp= range_trp; + best_read_time= best_trp->read_cost; + } + /* + Simultaneous key scans and row deletes on several handler + objects are not allowed so don't use ROR-intersection for + table deletes. + */ + if ((thd->lex->sql_command != SQLCOM_DELETE) && + optimizer_flag(thd, OPTIMIZER_SWITCH_INDEX_MERGE)) + { /* - Simultaneous key scans and row deletes on several handler - objects are not allowed so don't use ROR-intersection for - table deletes. + Get best non-covering ROR-intersection plan and prepare data for + building covering ROR-intersection. */ - if ((thd->lex->sql_command != SQLCOM_DELETE) && - optimizer_flag(thd, OPTIMIZER_SWITCH_INDEX_MERGE)) + if ((rori_trp= get_best_ror_intersect(¶m, tree, best_read_time, + &can_build_covering))) { + best_trp= rori_trp; + best_read_time= best_trp->read_cost; /* - Get best non-covering ROR-intersection plan and prepare data for - building covering ROR-intersection. + Try constructing covering ROR-intersect only if it looks possible + and worth doing. */ - if ((rori_trp= get_best_ror_intersect(¶m, tree, best_read_time, - &can_build_covering))) - { + if (!rori_trp->is_covering && can_build_covering && + (rori_trp= get_best_covering_ror_intersect(¶m, tree, + best_read_time))) best_trp= rori_trp; - best_read_time= best_trp->read_cost; - /* - Try constructing covering ROR-intersect only if it looks possible - and worth doing. - */ - if (!rori_trp->is_covering && can_build_covering && - (rori_trp= get_best_covering_ror_intersect(¶m, tree, - best_read_time))) - best_trp= rori_trp; - } } } - else + + if (optimizer_flag(thd, OPTIMIZER_SWITCH_INDEX_MERGE)) { - if (optimizer_flag(thd, OPTIMIZER_SWITCH_INDEX_MERGE)) + /* Try creating index_merge/ROR-union scan. */ + SEL_IMERGE *imerge; + TABLE_READ_PLAN *best_conj_trp= NULL, *new_conj_trp; + LINT_INIT(new_conj_trp); /* no empty index_merge lists possible */ + DBUG_PRINT("info",("No range reads possible," + " trying to construct index_merge")); + List_iterator_fast<SEL_IMERGE> it(tree->merges); + while ((imerge= it++)) { - /* Try creating index_merge/ROR-union scan. */ - SEL_IMERGE *imerge; - TABLE_READ_PLAN *best_conj_trp= NULL, *new_conj_trp; - LINT_INIT(new_conj_trp); /* no empty index_merge lists possible */ - DBUG_PRINT("info",("No range reads possible," - " trying to construct index_merge")); - List_iterator_fast<SEL_IMERGE> it(tree->merges); - while ((imerge= it++)) + new_conj_trp= get_best_disjunct_quick(¶m, imerge, best_read_time); + if (new_conj_trp) + set_if_smaller(param.table->quick_condition_rows, + new_conj_trp->records); + if (new_conj_trp && + (!best_conj_trp || + new_conj_trp->read_cost < best_conj_trp->read_cost)) { - new_conj_trp= get_best_disjunct_quick(¶m, imerge, best_read_time); - if (new_conj_trp) - set_if_smaller(param.table->quick_condition_rows, - new_conj_trp->records); - if (!best_conj_trp || (new_conj_trp && new_conj_trp->read_cost < - best_conj_trp->read_cost)) - best_conj_trp= new_conj_trp; + best_conj_trp= new_conj_trp; + best_read_time= best_conj_trp->read_cost; } - if (best_conj_trp) - best_trp= best_conj_trp; } + if (best_conj_trp) + best_trp= best_conj_trp; } } @@ -3696,7 +4218,6 @@ TABLE_READ_PLAN *get_best_disjunct_quick { SEL_TREE **ptree; TRP_INDEX_MERGE *imerge_trp= NULL; - uint n_child_scans= imerge->trees_next - imerge->trees; TRP_RANGE **range_scans; TRP_RANGE **cur_child; TRP_RANGE **cpk_scan= NULL; @@ -3716,6 +4237,26 @@ TABLE_READ_PLAN *get_best_disjunct_quick DBUG_ENTER("get_best_disjunct_quick"); DBUG_PRINT("info", ("Full table scan cost: %g", read_time)); + /* + In every tree of imerge remove SEL_ARG trees that do not make ranges. + Remove a tree from imerge if no SEL_ARG trees remain in it. + */ + SEL_TREE **new_trees_next= imerge->trees; + for (ptree= new_trees_next; ptree != imerge->trees_next; ptree++) + { + if (remove_nonrange_trees(param, *ptree)) + continue; + if (ptree > new_trees_next) + *new_trees_next= *ptree; + new_trees_next++; + } + imerge->trees_next= new_trees_next; + + uint n_child_scans= imerge->trees_next - imerge->trees; + + if (!n_child_scans) + DBUG_RETURN(NULL); + if (!(range_scans= (TRP_RANGE**)alloc_root(param->mem_root, sizeof(TRP_RANGE*)* n_child_scans))) @@ -3835,6 +4376,13 @@ TABLE_READ_PLAN *get_best_disjunct_quick imerge_trp->range_scans_end= range_scans + n_child_scans; read_time= imerge_cost; } + if (imerge_trp) + { + TABLE_READ_PLAN *trp= merge_same_index_scans(param, imerge, imerge_trp, + read_time); + if (trp != imerge_trp) + DBUG_RETURN(trp); + } } build_ror_index_merge: @@ -3850,6 +4398,7 @@ build_ror_index_merge: sizeof(TABLE_READ_PLAN*)* n_child_scans))) DBUG_RETURN(imerge_trp); + skip_to_ror_scan: roru_index_costs= 0.0; roru_total_records= 0; @@ -3933,7 +4482,116 @@ skip_to_ror_scan: DBUG_RETURN(roru); } } - DBUG_RETURN(imerge_trp); + DBUG_RETURN(imerge_trp); +} + + +/* + Merge index scans for the same indexes in an index merge plan + + SYNOPSIS + merge_same_index_scans() + param Context info for the operation + imerge IN/OUT SEL_IMERGE from which imerge_trp has been extracted + imerge_trp The index merge plan where index scans for the same + indexes are to be merges + read_time The upper bound for the cost of the plan to be evaluated + + DESRIPTION + For the given index merge plan imerge_trp extracted from the SEL_MERGE + imerge the function looks for range scans with the same indexes and merges + them into SEL_ARG trees. Then for each such SEL_ARG tree r_i the function + creates a range tree rt_i that contains only r_i. All rt_i are joined + into one index merge that replaces the original index merge imerge. + The function calls get_best_disjunct_quick for the new index merge to + get a new index merge plan that contains index scans only for different + indexes. + If there are no index scans for the same index in the original index + merge plan the function does not change the original imerge and returns + imerge_trp as its result. + + RETURN + The original or or improved index merge plan +*/ + +static +TABLE_READ_PLAN *merge_same_index_scans(PARAM *param, SEL_IMERGE *imerge, + TRP_INDEX_MERGE *imerge_trp, + double read_time) +{ + uint16 first_scan_tree_idx[MAX_KEY]; + SEL_TREE **tree; + TRP_RANGE **cur_child; + uint removed_cnt= 0; + + DBUG_ENTER("merge_same_index_scans"); + + bzero(first_scan_tree_idx, sizeof(first_scan_tree_idx[0])*param->keys); + + for (tree= imerge->trees, cur_child= imerge_trp->range_scans; + tree != imerge->trees_next; + tree++, cur_child++) + { + DBUG_ASSERT(tree); + uint key_idx= (*cur_child)->key_idx; + uint16 *tree_idx_ptr= &first_scan_tree_idx[key_idx]; + if (!*tree_idx_ptr) + *tree_idx_ptr= (uint16) (tree-imerge->trees+1); + else + { + SEL_TREE **changed_tree= imerge->trees+(*tree_idx_ptr-1); + SEL_ARG *key= (*changed_tree)->keys[key_idx]; + bzero((*changed_tree)->keys, + sizeof((*changed_tree)->keys[0])*param->keys); + (*changed_tree)->keys_map.clear_all(); + if (((*changed_tree)->keys[key_idx]= + key_or(param, key, (*tree)->keys[key_idx]))) + (*changed_tree)->keys_map.set_bit(key_idx); + *tree= NULL; + removed_cnt++; + } + } + if (!removed_cnt) + DBUG_RETURN(imerge_trp); + + TABLE_READ_PLAN *trp= NULL; + SEL_TREE **new_trees_next= imerge->trees; + for (tree= new_trees_next; tree != imerge->trees_next; tree++) + { + if (!*tree) + continue; + if (tree > new_trees_next) + *new_trees_next= *tree; + new_trees_next++; + } + imerge->trees_next= new_trees_next; + + DBUG_ASSERT(imerge->trees_next>imerge->trees); + + if (imerge->trees_next-imerge->trees > 1) + trp= get_best_disjunct_quick(param, imerge, read_time); + else + { + /* + This alternative theoretically can be reached when the cost + of the index merge for such a formula as + (key1 BETWEEN c1_1 AND c1_2) AND key2 > c2 OR + (key1 BETWEEN c1_3 AND c1_4) AND key3 > c3 + is estimated as being cheaper than the cost of index scan for + the formula + (key1 BETWEEN c1_1 AND c1_2) OR (key1 BETWEEN c1_3 AND c1_4) + + In the current code this may happen for two reasons: + 1. for a single index range scan data records are accessed in + a random order + 2. the functions that estimate the cost of a range scan and an + index merge retrievals are not well calibrated + */ + trp= get_key_scans_params(param, *imerge->trees, FALSE, TRUE, + read_time); + } + + DBUG_RETURN(trp); } @@ -4029,7 +4687,7 @@ ROR_SCAN_INFO *make_ror_scan(const PARAM ror_scan->key_rec_length= (param->table->key_info[keynr].key_length + param->table->file->ref_length); ror_scan->sel_arg= sel_arg; - ror_scan->records= param->table->quick_rows[keynr]; + ror_scan->records= param->quick_rows[keynr]; if (!(bitmap_buf= (my_bitmap_map*) alloc_root(param->mem_root, param->fields_bitmap_size))) @@ -4049,7 +4707,7 @@ ROR_SCAN_INFO *make_ror_scan(const PARAM bitmap_set_bit(&ror_scan->covered_fields, key_part->fieldnr-1); } ror_scan->index_read_cost= - get_index_only_read_time(param, param->table->quick_rows[ror_scan->keynr], + get_index_only_read_time(param, param->quick_rows[ror_scan->keynr], ror_scan->keynr); DBUG_RETURN(ror_scan); } @@ -4335,7 +4993,7 @@ static double ror_scan_selectivity(const } if (!prev_covered) { - double tmp= rows2double(info->param->table->quick_rows[scan->keynr]) / + double tmp= rows2double(info->param->quick_rows[scan->keynr]) / rows2double(prev_records); DBUG_PRINT("info", ("Selectivity multiplier: %g", tmp)); selectivity_mult *= tmp; @@ -4414,7 +5072,7 @@ static bool ror_intersect_add(ROR_INTERS } else { - info->index_records += info->param->table->quick_rows[ror_scan->keynr]; + info->index_records += info->param->quick_rows[ror_scan->keynr]; info->index_scan_costs += ror_scan->index_read_cost; bitmap_union(&info->covered_fields, &ror_scan->covered_fields); if (!info->is_covering && bitmap_is_subset(&info->param->needed_fields, @@ -6044,13 +6702,138 @@ sel_add(SEL_ARG *key1,SEL_ARG *key2) return root; } -#define CLONE_KEY1_MAYBE 1 -#define CLONE_KEY2_MAYBE 2 -#define swap_clone_flag(A) ((A & 1) << 1) | ((A & 2) >> 1) +/* + Build a range tree for the conjunction of the range parts of two trees -static SEL_TREE * -tree_and(RANGE_OPT_PARAM *param,SEL_TREE *tree1,SEL_TREE *tree2) + SYNOPSIS + and_range_trees() + param Context info for the operation + tree1 SEL_TREE for the first conjunct + tree2 SEL_TREE for the second conjunct + result SEL_TREE for the result + + DESCRIPTION + This function takes range parts of two trees tree1 and tree2 and builds + a range tree for the conjunction of the formulas that these two range parts + represent. + More exactly: + if the range part of tree1 represents the normalized formula + R1_1 AND ... AND R1_k, + and the range part of tree2 represents the normalized formula + R2_1 AND ... AND R2_k, + then the range part of the result represents the formula: + RT = R_1 AND ... AND R_k, where R_i=(R1_i AND R2_i) for each i from [1..k] + + The function assumes that tree1 is never equal to tree2. At the same + time the tree result can be the same as tree1 (but never as tree2). + If result==tree1 then rt replaces the range part of tree1 leaving + imerges as they are. + if result!=tree1 than it is assumed that the SEL_ARG trees in tree1 and + tree2 should be preserved. Otherwise they can be destroyed. + + RETURN + 1 if the type the result tree is SEL_TREE::IMPOSSIBLE + 0 otherwise +*/ + +static +int and_range_trees(RANGE_OPT_PARAM *param, SEL_TREE *tree1, SEL_TREE *tree2, + SEL_TREE *result) +{ + DBUG_ENTER("and_ranges"); + key_map result_keys; + result_keys.clear_all(); + key_map anded_keys= tree1->keys_map; + anded_keys.merge(tree2->keys_map); + int key_no; + key_map::Iterator it(anded_keys); + while ((key_no= it++) != key_map::Iterator::BITMAP_END) + { + uint flag=0; + SEL_ARG *key1= tree1->keys[key_no]; + SEL_ARG *key2= tree2->keys[key_no]; + if (key1 && !key1->simple_key()) + flag|= CLONE_KEY1_MAYBE; + if (key2 && !key2->simple_key()) + flag|=CLONE_KEY2_MAYBE; + if (result != tree1) + { + if (key1) + key1->incr_refs(); + if (key2) + key2->incr_refs(); + } + SEL_ARG *key; + if ((result->keys[key_no]= key =key_and(param, key1, key2, flag))) + { + if (key && key->type == SEL_ARG::IMPOSSIBLE) + { + result->type= SEL_TREE::IMPOSSIBLE; + DBUG_RETURN(1); + } + result_keys.set_bit(key_no); +#ifdef EXTRA_DEBUG + if (param->alloced_sel_args < SEL_ARG::MAX_SEL_ARGS) + key->test_use_count(key); +#endif + } + } + result->keys_map= result_keys; + DBUG_RETURN(0); +} + + +/* + Build a SEL_TREE for a conjunction out of such trees for the conjuncts + + SYNOPSIS + tree_and() + param Context info for the operation + tree1 SEL_TREE for the first conjunct + tree2 SEL_TREE for the second conjunct + + DESCRIPTION + This function builds a tree for the formula (A AND B) out of the trees + tree1 and tree2 that has been built for the formulas A and B respectively. + + In a general case + tree1 represents the formula RT1 AND MT1, + where RT1 = R1_1 AND ... AND R1_k1, MT1=M1_1 AND ... AND M1_l1; + tree2 represents the formula RT2 AND MT2 + where RT2 = R2_1 AND ... AND R2_k2, MT2=M2_1 and ... and M2_l2. + + The result tree will represent the formula of the the following structure: + RT AND MT1 AND MT2 AND RT1MT2 AND RT2MT1, such that + rt is a tree obtained by range intersection of trees tree1 and tree2, + RT1MT2 = RT1M2_1 AND ... AND RT1M2_l2, + RT2MT1 = RT2M1_1 AND ... AND RT2M1_l1, + where rt1m2_i (i=1,...,l2) is the result of the pushdown operation + of range tree rt1 into imerge m2_i, while rt2m1_j (j=1,...,l1) is the + result of the pushdown operation of range tree rt2 into imerge m1_j. + + RT1MT2/RT2MT is empty if MT2/MT1 is empty. + + The range intersection of two range trees is produced by the function + and_range_trees. The pushdown of a range tree to a imerge is performed + by the function imerge_list_and_tree. This function may produce imerges + containing only one range tree. Such trees are intersected with rt and + the result of intersection is returned as the range part of the result + tree, while the corresponding imerges are removed altogether from its + imerge part. + + NOTE. + The pushdown operation of range trees into imerges is needed to be able + to construct valid imerges for the condition like this: + key1_p1=c1 AND (key1_p2 BETWEEN c21 AND c22 OR key2 < c2) + + RETURN + The result tree, if a success + 0 - otherwise. +*/ + +static +SEL_TREE *tree_and(RANGE_OPT_PARAM *param, SEL_TREE *tree1, SEL_TREE *tree2) { DBUG_ENTER("tree_and"); if (!tree1) @@ -6072,87 +6855,208 @@ tree_and(RANGE_OPT_PARAM *param,SEL_TREE tree1->type=SEL_TREE::KEY_SMALLER; DBUG_RETURN(tree1); } - key_map result_keys; - result_keys.clear_all(); - - /* Join the trees key per key */ - SEL_ARG **key1,**key2,**end; - for (key1= tree1->keys,key2= tree2->keys,end=key1+param->keys ; - key1 != end ; key1++,key2++) + + if (!tree1->merges.is_empty()) + imerge_list_and_tree(param, &tree1->merges, tree2); + if (!tree2->merges.is_empty()) + imerge_list_and_tree(param, &tree2->merges, tree1); + if (and_range_trees(param, tree1, tree2, tree1)) + DBUG_RETURN(tree1); + imerge_list_and_list(&tree1->merges, &tree2->merges); + eliminate_single_tree_imerges(param, tree1); + DBUG_RETURN(tree1); +} + + +/* + Eliminate single tree imerges in a SEL_TREE objects + + SYNOPSIS + eliminate_single_tree_imerges() + param Context info for the function + tree SEL_TREE where single tree imerges are to be eliminated + + DESCRIPTION + For each imerge in 'tree' that contains only one disjunct tree, i.e. + for any imerge of the form m=rt, the function performs and operation + the range part of tree, replaces rt the with the result of anding and + removes imerge m from the the merge part of 'tree'. + + RETURN VALUE + none +*/ + +static +void eliminate_single_tree_imerges(RANGE_OPT_PARAM *param, SEL_TREE *tree) +{ + SEL_IMERGE *imerge; + List<SEL_IMERGE> merges= tree->merges; + List_iterator<SEL_IMERGE> it(merges); + tree->merges.empty(); + while ((imerge= it++)) { - uint flag=0; - if (*key1 || *key2) + if (imerge->trees+1 == imerge->trees_next) { - if (*key1 && !(*key1)->simple_key()) - flag|=CLONE_KEY1_MAYBE; - if (*key2 && !(*key2)->simple_key()) - flag|=CLONE_KEY2_MAYBE; - *key1=key_and(param, *key1, *key2, flag); - if (*key1 && (*key1)->type == SEL_ARG::IMPOSSIBLE) - { - tree1->type= SEL_TREE::IMPOSSIBLE; - DBUG_RETURN(tree1); - } - result_keys.set_bit(key1 - tree1->keys); -#ifdef EXTRA_DEBUG - if (*key1 && param->alloced_sel_args < SEL_ARG::MAX_SEL_ARGS) - (*key1)->test_use_count(*key1); -#endif + tree= tree_and(param, tree, *imerge->trees); + it.remove(); } } - tree1->keys_map= result_keys; - /* dispose index_merge if there is a "range" option */ - if (!result_keys.is_clear_all()) - { - tree1->merges.empty(); - DBUG_RETURN(tree1); - } + tree->merges= merges; +} - /* ok, both trees are index_merge trees */ - imerge_list_and_list(&tree1->merges, &tree2->merges); - DBUG_RETURN(tree1); + +/* + For two trees check that there are indexes with ranges in both of them + + SYNOPSIS + sel_trees_have_common_keys() + param Context info for the function + tree1 SEL_TREE for the first tree + tree2 SEL_TREE for the second tree + common_keys OUT bitmap of all indexes with ranges in both trees + + DESCRIPTION + For two trees tree1 and tree1 the function checks if there are indexes + in their range parts such that SEL_ARG trees are defined for them in the + range parts of both trees. The function returns the bitmap of such + indexes in the parameter common_keys. + + RETURN + TRUE if there are such indexes (common_keys is nor empty) + FALSE otherwise +*/ + +static +bool sel_trees_have_common_keys(RANGE_OPT_PARAM* param, + SEL_TREE *tree1, SEL_TREE *tree2, + key_map *common_keys) +{ + *common_keys= tree1->keys_map; + common_keys->intersect(tree2->keys_map); + return !common_keys->is_clear_all(); } /* - Check if two SEL_TREES can be combined into one (i.e. a single key range - read can be constructed for "cond_of_tree1 OR cond_of_tree2" ) without - using index_merge. + Check whether range parts of two trees can be ored for some indexes + + SYNOPSIS + sel_trees_can_be_ored() + param Context info for the function + tree1 SEL_TREE for the first tree + tree2 SEL_TREE for the second tree + common_keys IN/OUT IN: bitmap of all indexes with SEL_ARG in both trees + OUT: bitmap of all indexes that can be ored + + DESCRIPTION + For two trees tree1 and tree2 and the bitmap common_keys containing + bits for indexes that have SEL_ARG trees in range parts of both trees + the function checks if there are indexes for which SEL_ARG trees can + be ored. Two SEL_ARG trees for the same index can be ored if the most + major components of the index used in these trees coincide. If the + SEL_ARG trees for an index cannot be ored the function clears the bit + for this index in the bitmap common_keys. + + The function does not verify that indexes marked in common_keys really + have SEL_ARG trees in both tree1 and tree2. It assumes that this is true. + + NOTE + The function sel_trees_can_be_ored is usually used in pair with the + function sel_trees_have_common_keys. + + RETURN + TRUE if there are indexes for which SEL_ARG trees can be ored + FALSE otherwise */ -bool sel_trees_can_be_ored(SEL_TREE *tree1, SEL_TREE *tree2, - RANGE_OPT_PARAM* param) +static +bool sel_trees_can_be_ored(RANGE_OPT_PARAM* param, + SEL_TREE *tree1, SEL_TREE *tree2, + key_map *common_keys) { - key_map common_keys= tree1->keys_map; DBUG_ENTER("sel_trees_can_be_ored"); - common_keys.intersect(tree2->keys_map); + if (!sel_trees_have_common_keys(param, tree1, tree2, common_keys)) + DBUG_RETURN(FALSE); + int key_no; + key_map::Iterator it(*common_keys); + while ((key_no= it++) != key_map::Iterator::BITMAP_END) + { + DBUG_ASSERT(tree1->keys[key_no] && tree2->keys[key_no]); + /* Trees have a common key, check if they refer to the same key part */ + if (tree1->keys[key_no]->part != tree2->keys[key_no]->part) + common_keys->clear_bit(key_no); + } + DBUG_RETURN(!common_keys->is_clear_all()); +} + +/* + Check whether range parts of two trees must be ored for some indexes - if (common_keys.is_clear_all()) + SYNOPSIS + sel_trees_must_be_ored() + param Context info for the function + tree1 SEL_TREE for the first tree + tree2 SEL_TREE for the second tree + ordable_keys bitmap of SEL_ARG trees that can be ored + + DESCRIPTION + For two trees tree1 and tree2 and the bitmap ordable_keys containing + bits for indexes that have SEL_ARG trees in range parts of both trees + and these SEL_ARG trees can be ored the function checks if there are + indexes for which SEL_ARG trees must be ored. Two SEL_ARG trees for the + same index must be ored if all indexes for which SEL_SRG trees from the + range parts of tree1 anf tree2 that can be ored have the same field as + their major index component. + + NOTE + The function sel_trees_must_be_ored as a rule is used in pair with the + function sel_trees_can_be_ored. + + RETURN + TRUE if there are indexes for which SEL_ARG trees must be ored + FALSE otherwise +*/ + +static +bool sel_trees_must_be_ored(RANGE_OPT_PARAM* param, + SEL_TREE *tree1, SEL_TREE *tree2, + key_map oredable_keys) +{ + key_map tmp; + DBUG_ENTER("sel_trees_must_be_ored"); + + tmp= tree1->keys_map; + tmp.merge(tree2->keys_map); + tmp.subtract(oredable_keys); + if (!tmp.is_clear_all()) DBUG_RETURN(FALSE); - /* trees have a common key, check if they refer to same key part */ - SEL_ARG **key1,**key2; - for (uint key_no=0; key_no < param->keys; key_no++) + Field *field= 0; + uint part; + int key_no; + key_map::Iterator it(oredable_keys); + while ((key_no= it++) != key_map::Iterator::BITMAP_END) { - if (common_keys.is_set(key_no)) + SEL_ARG *key1= tree1->keys[key_no]; + if (!field) { - key1= tree1->keys + key_no; - key2= tree2->keys + key_no; - if ((*key1)->part == (*key2)->part) - { - DBUG_RETURN(TRUE); - } + field= key1->field; + part= key1->part; } + else if (!field->eq(key1->field)) + DBUG_RETURN(FALSE); } - DBUG_RETURN(FALSE); -} + DBUG_RETURN(TRUE); +} /* - Remove the trees that are not suitable for record retrieval. + Remove the trees that are not suitable for record retrieval + SYNOPSIS - param Range analysis parameter - tree Tree to be processed, tree->type is KEY or KEY_SMALLER + remove_nonrange_trees() + param Context info for the function + tree Tree to be processed, tree->type is KEY or KEY_SMALLER DESCRIPTION This function walks through tree->keys[] and removes the SEL_ARG* trees @@ -6163,41 +7067,34 @@ bool sel_trees_can_be_ored(SEL_TREE *tre A SEL_ARG* tree cannot be used to construct quick select if it has tree->part != 0. (e.g. it could represent "keypart2 < const"). - - WHY THIS FUNCTION IS NEEDED Normally we allow construction of SEL_TREE objects that have SEL_ARG - trees that do not allow quick range select construction. For example for - " keypart1=1 AND keypart2=2 " the execution will proceed as follows: + trees that do not allow quick range select construction. + For example: + for " keypart1=1 AND keypart2=2 " the execution will proceed as follows: tree1= SEL_TREE { SEL_ARG{keypart1=1} } tree2= SEL_TREE { SEL_ARG{keypart2=2} } -- can't make quick range select from this call tree_and(tree1, tree2) -- this joins SEL_ARGs into a usable SEL_ARG tree. - - There is an exception though: when we construct index_merge SEL_TREE, - any SEL_ARG* tree that cannot be used to construct quick range select can - be removed, because current range analysis code doesn't provide any way - that tree could be later combined with another tree. - Consider an example: we should not construct - st1 = SEL_TREE { - merges = SEL_IMERGE { - SEL_TREE(t.key1part1 = 1), - SEL_TREE(t.key2part2 = 2) -- (*) - } - }; - because - - (*) cannot be used to construct quick range select, - - There is no execution path that would cause (*) to be converted to - a tree that could be used. - - The latter is easy to verify: first, notice that the only way to convert - (*) into a usable tree is to call tree_and(something, (*)). - - Second look at what tree_and/tree_or function would do when passed a - SEL_TREE that has the structure like st1 tree has, and conlcude that - tree_and(something, (*)) will not be called. + Another example: + tree3= SEL_TREE { SEL_ARG{key1part1 = 1} } + tree4= SEL_TREE { SEL_ARG{key2part2 = 2} } -- can't make quick range select + from this + call tree_or(tree3, tree4) -- creates a SEL_MERGE ot of which no index + merge can be constructed, but it is potentially useful, as anding it with + tree5= SEL_TREE { SEL_ARG{key2part1 = 3} } creates an index merge that + represents the formula + key1part1=1 AND key2part1=3 OR key2part1=3 AND key2part2=2 + for which an index merge can be built. + + Any final SEL_TREE may contains SEL_ARG trees for which no quick select + can be built. Such SEL_ARG trees should be removed from the range part + before different range scans are evaluated. Such SEL_ARG trees also should + be removed from all range trees of each index merge before different + possible index merge plans are evaluated. + RETURN 0 Ok, some suitable trees left 1 No tree->keys[] left. @@ -6223,6 +7120,74 @@ static bool remove_nonrange_trees(RANGE_ } +/* + Build a SEL_TREE for a disjunction out of such trees for the disjuncts + + SYNOPSIS + tree_or() + param Context info for the operation + tree1 SEL_TREE for the first disjunct + tree2 SEL_TREE for the second disjunct + + DESCRIPTION + This function builds a tree for the formula (A OR B) out of the trees + tree1 and tree2 that has been built for the formulas A and B respectively. + + In a general case + tree1 represents the formula RT1 AND MT1, + where RT1=R1_1 AND ... AND R1_k1, MT1=M1_1 AND ... AND M1_l1; + tree2 represents the formula RT2 AND MT2 + where RT2=R2_1 AND ... AND R2_k2, MT2=M2_1 and ... and M2_l2. + + The function constructs the result tree according the formula + (RT1 OR RT2) AND (MT1 OR RT1) AND (MT2 OR RT2) AND (MT1 OR MT2) + that is equivalent to the formula (RT1 AND MT1) OR (RT2 AND MT2). + + To limit the number of produced imerges the function considers + a weaker formula than the original one: + (RT1 AND M1_1) OR (RT2 AND M2_1) + that is equivalent to: + (RT1 OR RT2) (1) + AND + (M1_1 OR M2_1) (2) + AND + (M1_1 OR RT2) (3) + AND + (M2_1 OR RT1) (4) + + For the first conjunct (1) the function builds a tree with a range part + and, possibly, one imerge. For the other conjuncts (2-4)the function + produces sets of imerges. All constructed imerges are included into the + result tree. + + For the formula (1) the function produces the tree representing a formula + of the structure RT [AND M], such that: + - the range tree rt contains the result of oring SEL_ARG trees from rt1 + and rt2 + - the imerge m consists of two range trees rt1 and rt2. + The imerge m is added if it's not true that rt1 and rt2 must be ored + If rt1 and rt2 can't be ored rt is empty and only m is produced for (1). + + To produce imerges for the formula (2) the function calls the function + imerge_list_or_list passing it the merge parts of tree1 and tree2 as + parameters. + + To produce imerges for the formula (3) the function calls the function + imerge_list_or_tree passing it the imerge m1_1 and the range tree rt2 as + parameters. Similarly, to produce imerges for the formula (4) the function + calls the function imerge_list_or_tree passing it the imerge m2_1 and the + range tree rt1. + + If rt1 is empty then the trees for (1) and (4) are empty. + If rt2 is empty then the trees for (1) and (3) are empty. + If mt1 is empty then the trees for (2) and (3) are empty. + If mt2 is empty then the trees for (2) and (4) are empty. + + RETURN + The result tree for the operation if a success + 0 - otherwise +*/ + static SEL_TREE * tree_or(RANGE_OPT_PARAM *param,SEL_TREE *tree1,SEL_TREE *tree2) { @@ -6238,74 +7203,100 @@ tree_or(RANGE_OPT_PARAM *param,SEL_TREE if (tree2->type == SEL_TREE::MAYBE) DBUG_RETURN(tree2); - SEL_TREE *result= 0; - key_map result_keys; - result_keys.clear_all(); - if (sel_trees_can_be_ored(tree1, tree2, param)) + SEL_TREE *result= NULL; + key_map result_keys; + key_map ored_keys; + SEL_TREE *rtree[2]= {NULL,NULL}; + SEL_IMERGE *imerge[2]= {NULL, NULL}; + bool no_ranges1= tree1->without_ranges(); + bool no_ranges2= tree2->without_ranges(); + bool no_merges1= tree1->without_imerges(); + bool no_merges2= tree2->without_imerges(); + if (!no_ranges1 && !no_merges2) + { + rtree[0]= new SEL_TREE(tree1, TRUE, param); + imerge[1]= new SEL_IMERGE(tree2->merges.head(), 0, param); + } + if (!no_ranges2 && !no_merges1) { - /* Join the trees key per key */ - SEL_ARG **key1,**key2,**end; - for (key1= tree1->keys,key2= tree2->keys,end= key1+param->keys ; - key1 != end ; key1++,key2++) - { - *key1=key_or(param, *key1, *key2); - if (*key1) + rtree[1]= new SEL_TREE(tree2, TRUE, param); + imerge[0]= new SEL_IMERGE(tree1->merges.head(), 0, param); + } + bool no_imerge_from_ranges= FALSE; + if (!(result= new SEL_TREE())) + DBUG_RETURN(result); + + /* Build the range part of the tree for the formula (1) */ + if (sel_trees_can_be_ored(param, tree1, tree2, &ored_keys)) + { + bool must_be_ored= sel_trees_must_be_ored(param, tree1, tree2, ored_keys); + no_imerge_from_ranges= must_be_ored; + key_map::Iterator it(ored_keys); + int key_no; + while ((key_no= it++) != key_map::Iterator::BITMAP_END) + { + SEL_ARG *key1= tree1->keys[key_no]; + SEL_ARG *key2= tree2->keys[key_no]; + if (!must_be_ored) { - result=tree1; // Added to tree1 - result_keys.set_bit(key1 - tree1->keys); -#ifdef EXTRA_DEBUG - if (param->alloced_sel_args < SEL_ARG::MAX_SEL_ARGS) - (*key1)->test_use_count(*key1); -#endif + key1->incr_refs(); + key2->incr_refs(); } + if ((result->keys[key_no]= key_or(param, key1, key2))) + result->keys_map.set_bit(key_no); } - if (result) - result->keys_map= result_keys; + result->type= tree1->type; } - else + + if (no_imerge_from_ranges && no_merges1 && no_merges2) { - /* ok, two trees have KEY type but cannot be used without index merge */ - if (tree1->merges.is_empty() && tree2->merges.is_empty()) - { - if (param->remove_jump_scans) - { - bool no_trees= remove_nonrange_trees(param, tree1); - no_trees= no_trees || remove_nonrange_trees(param, tree2); - if (no_trees) - DBUG_RETURN(new SEL_TREE(SEL_TREE::ALWAYS)); - } - SEL_IMERGE *merge; - /* both trees are "range" trees, produce new index merge structure */ - if (!(result= new SEL_TREE()) || !(merge= new SEL_IMERGE()) || - (result->merges.push_back(merge)) || - (merge->or_sel_tree(param, tree1)) || - (merge->or_sel_tree(param, tree2))) + if (result->keys_map.is_clear_all()) + result->type= SEL_TREE::ALWAYS; + DBUG_RETURN(result); + } + + SEL_IMERGE *imerge_from_ranges; + if (!(imerge_from_ranges= new SEL_IMERGE())) + result= NULL; + else if (!no_ranges1 && !no_ranges2 && !no_imerge_from_ranges) + { + /* Build the imerge part of the tree for the formula (1) */ + SEL_TREE *rt1= tree1; + SEL_TREE *rt2= tree2; + if (!no_merges1) + rt1= new SEL_TREE(tree1, TRUE, param); + if (!no_merges2) + rt2= new SEL_TREE(tree2, TRUE, param); + if (!rt1 || !rt2 || + result->merges.push_back(imerge_from_ranges) || + imerge_from_ranges->or_sel_tree(param, rt1) || + imerge_from_ranges->or_sel_tree(param, rt2)) result= NULL; - else - result->type= tree1->type; - } - else if (!tree1->merges.is_empty() && !tree2->merges.is_empty()) - { - if (imerge_list_or_list(param, &tree1->merges, &tree2->merges)) - result= new SEL_TREE(SEL_TREE::ALWAYS); - else - result= tree1; - } - else - { - /* one tree is index merge tree and another is range tree */ - if (tree1->merges.is_empty()) - swap_variables(SEL_TREE*, tree1, tree2); - - if (param->remove_jump_scans && remove_nonrange_trees(param, tree2)) - DBUG_RETURN(new SEL_TREE(SEL_TREE::ALWAYS)); - /* add tree2 to tree1->merges, checking if it collapses to ALWAYS */ - if (imerge_list_or_tree(param, &tree1->merges, tree2)) - result= new SEL_TREE(SEL_TREE::ALWAYS); - else - result= tree1; - } } + if (!result) + DBUG_RETURN(result); + + result->type= tree1->type; + + if (!no_merges1 && !no_merges2 && + !imerge_list_or_list(param, &tree1->merges, &tree2->merges)) + { + /* Build the imerges for the formula (2) */ + imerge_list_and_list(&result->merges, &tree1->merges); + } + + /* Build the imerges for the formulas (3) and (4) */ + for (uint i=0; i < 2; i++) + { + List<SEL_IMERGE> merges; + SEL_TREE *rt= rtree[i]; + SEL_IMERGE *im= imerge[1-i]; + + if (rt && im && !merges.push_back(im) && + !imerge_list_or_tree(param, &merges, rt)) + imerge_list_and_list(&result->merges, &merges); + } + DBUG_RETURN(result); } @@ -6558,7 +7549,7 @@ key_or(RANGE_OPT_PARAM *param, SEL_ARG * { swap_variables(SEL_ARG *,key1,key2); } - if (key1->use_count > 0 || !(key1=key1->clone_tree(param))) + if (key1->use_count > 0 && !(key1=key1->clone_tree(param))) return 0; // OOM } @@ -7237,11 +8228,7 @@ static ulong count_key_part_usage(SEL_AR void SEL_ARG::test_use_count(SEL_ARG *root) { uint e_count=0; - if (this == root && use_count != 1) - { - sql_print_information("Use_count: Wrong count %lu for root",use_count); - return; - } + if (this->type != SEL_ARG::KEY_RANGE) return; for (SEL_ARG *pos=first(); pos ; pos=pos->next) @@ -7344,12 +8331,13 @@ check_quick_select(PARAM *param,uint idx param->table->quick_n_ranges[key]= param->n_ranges; param->table->quick_condition_rows= min(param->table->quick_condition_rows, records); + param->table->quick_rows[key]= records; } /* Need to save quick_rows in any case as it is used when calculating cost of ROR intersection: */ - param->table->quick_rows[key]=records; + param->quick_rows[key]= records; if (cpk_scan) param->is_ror_scan= TRUE; } === modified file 'sql/sql_list.h' --- a/sql/sql_list.h 2009-09-15 10:46:35 +0000 +++ b/sql/sql_list.h 2009-10-12 04:59:34 +0000 @@ -168,6 +168,14 @@ public: { if (!list->is_empty()) { +#if 0 +#else + if (is_empty()) + { + *this= *list; + return; + } +#endif *last= list->first; last= list->last; elements+= list->elements;
participants (1)
-
Igor Babaev