【问题标题】:Optimize a MySQL count each duplicate Query优化每个重复查询的 MySQL 计数
【发布时间】:2010-04-16 23:57:34
【问题描述】:

我有以下查询,它获取城市名称、城市 ID、地区名称以及该记录的重复名称计数:

选择 Country_CA.City 作为 currentCity,Country_CA.CityID,globe_region.region_name, ( SELECT count(Country_CA.City) FROM Country_CA WHERE City LIKE currentCity ) 作为计数器 FROM Country_CA 左连接地球区域 ON globe_region.region_id = Country_CA.RegionID AND globe_region.country_code = Country_CA.CountryCode 按城市订购

此示例适用于加拿大,城市将显示在下拉列表中。

加拿大和其他国家/地区有几个城镇名称相同。因此,我想知道是否有多个城镇名称相同的地区名称将附加到城镇名称中。区域名称可在 globe_region 表中找到。

Country_CA 和 globe_region 看起来与此类似(出于可视化目的,我更改了一些内容)

如果不存在`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', 主键(`City`,`RegionID`), KEY `CityID` (`CityID`) ) 引擎=MyISAM 默认字符集=utf8;

如果不存在 `globe_region` 则创建表( `country_code` char(2) 整理 utf8_unicode_ci NOT NULL, `region_code` char(2) 整理 utf8_unicode_ci NOT NULL, `region_name` varchar(50) 整理 utf8_unicode_ci NOT NULL, 主键(`country_code`,`region_code`) ) 引擎=MyISAM 默认字符集=utf8 排序=utf8_unicode_ci;

顶部的查询完全符合我的要求,但是生成 5000 条记录的列表需要很长时间。我想知道是否有办法优化子查询以便更快地获得相同的结果。

结果应该是这样的

城市 CityID region_name 计数器 喜来登 2349269 不列颠哥伦比亚省 1 舍布鲁克 2349270 魁北克 2 舍布鲁克 2349271 新斯科舍省 2 在这里 2349273 不列颠哥伦比亚省 1 谢里登 2349274 马尼托巴省 1

【问题讨论】:

    标签: mysql optimization


    【解决方案1】:

    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
    

    【讨论】:

      猜你喜欢
      • 2016-06-02
      • 2020-05-21
      • 2011-05-22
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      • 2012-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多