优化每个重复查询的MySQL计数

时间:2010-04-16 23:57:34

标签: mysql optimization

我有以下查询获取该记录的城市名称,城市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

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