数百万条记录的MySQL查询速度慢

时间:2014-03-18 15:16:44

标签: mysql sql join

专家,

我需要MySQL查询的帮助。它涉及两个表:' usedcars'和'县'。

' usedcars':1600多万条记录,

'县':3100条记录

我的查询需要分钟才能完成。它很难排除故障,因为MySQL会缓存结果,因此当我重新运行相同的查询时,它会在一秒钟内出现!

我确定子查询正在杀死我,所以我可以使用一些提示替代。

以下是一个示例:

SELECT p.make,p.total,sum(p.total) AS theCount, 
sum(p.total)/
    (SELECT sum(p.total) AS theCount FROM usedcars p, counties c
    WHERE c.FIPS IN (55009,55061,55083) AND c.statecounty = p.statecounty) AS MktPerc 
FROM usedcars p, counties c 
WHERE c.FIPS IN (55009,55061,55083) 
AND c.statecounty = p.statecounty 
GROUP BY make 
ORDER BY theCount DESC

我正在寻找在特定县(FIPS)按品牌销售的汽车数量以及同一品牌中该品牌的市场份额(mktPerc)。

市场份额:按品牌销售的汽车数量/按所有品牌销售的汽车数量

这里是EXPLAIN:

http://1drv.ms/NqVuYT

以下是返回示例。它给了我我想要的东西。只需要太长时间!

http://1drv.ms/1egJ0xm

2 个答案:

答案 0 :(得分:0)

我会简化以下内容。

SELECT
      p.make,
      SUM( p.total ) SumTotal,
      AVG( p.total ) AvgTotal,
      AllBrands.TotalAllBrands,
      SUM( p.total ) / AllBrands.TotalAllBrands as MtkPcnt
   from
      counties c
         JOIN usedCars p
            ON c.statecounty = p.statecounty,
      ( SELECT
           SUM( p.total ) TotalAllBrands
        from
           counties c
              JOIN usedCars p
                 ON c.statecounty = p.statecounty,
        where
           c.FIPS in ( 55009,55061,55083 ) ) AllBrands
   where
      c.FIPS in ( 55009,55061,55083 ) ) 
   group by
      p.make
   order by
      sum( p.total ) desc

为了帮助优化,我会通过

覆盖索引
table       index
counties    ( FIPS, StateCounty )
usedCars    ( stateCounty, make, total )

答案 1 :(得分:0)

确保您拥有以下索引:

usedcars - >州/县
国家 - > (FIPS,statecounty)

使用以下查询:

ALTER TABLE usedcars  ADD INDEX usedcar_index (statecounty);
ALTER TABLE countries ADD INDEX country_index (FIPS, statecounty);