我有以下查询获取该记录的城市名称,城市ID,区域名称和重复名称的计数:
SELECT Country_CA.City AS currentCity, Country_CA.CityID, globe_region.region_name, ( SELECT count(Country_CA.City) FROM Country_CA WHERE City LIKE currentCity ) as counter FROM Country_CA LEFT JOIN globe_region ON globe_region.region_id = Country_CA.RegionID AND globe_region.country_code = Country_CA.CountryCode ORDER BY City
此示例适用于加拿大,城市将显示在下拉列表中。
加拿大和其他国家的一些城镇名称相同。因此,我想知道是否有多个具有相同名称的城镇名称将附加到城镇名称。区域名称可在globe_region表中找到。
Country_CA和globe_region看起来与此类似(为了可视化目的,我更改了一些内容)
CREATE TABLE IF NOT EXISTS `Country_CA` ( `City` varchar(75) NOT NULL DEFAULT '', `RegionID` varchar(10) NOT NULL DEFAULT '', `CountryCode` varchar(10) NOT NULL DEFAULT '', `CityID` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`City`,`RegionID`), KEY `CityID` (`CityID`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
和
CREATE TABLE IF NOT EXISTS `globe_region` ( `country_code` char(2) COLLATE utf8_unicode_ci NOT NULL, `region_code` char(2) COLLATE utf8_unicode_ci NOT NULL, `region_name` varchar(50) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`country_code`,`region_code`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
顶部的查询完全符合我的要求,但生成5000条记录的列表需要花费太长时间。我想知道是否有一种方法可以优化子查询,以便更快地获得相同的结果。
结果应如下所示
City CityID region_name counter sheraton 2349269 British Columbia 1 sherbrooke 2349270 Quebec 2 sherbrooke 2349271 Nova Scotia 2 shere 2349273 British Columbia 1 sherridon 2349274 Manitoba 1
答案 0 :(得分:2)
在Country_CA.City上建立索引可能足以加速子选择,因为它不需要查阅该表。从LIKE
更改为=
可能会有所不同。 documentation表示LIKE只能使用索引,如果其中一个参数是不以通配符开头的常量字符串。 Country_CA.City不应以通配符开头。它并不严格地说是一个常量字符串,尽管每个子查询都是常量。
或者,联接可能会更快。
SELECT Country_CA.City AS currentCity, Country_CA.CityID, globe_region.region_name,
count(homonyms.City) as counter
FROM Country_CA
LEFT JOIN globe_region
ON globe_region.region_id = Country_CA.RegionID
AND globe_region.country_code = Country_CA.CountryCode
JOIN Country_CA AS homonyms
ON Country_CA.City = homonyms.City
GROUP BY Country_CA.CityID
ORDER BY City