【问题标题】:mySQL Performant request to make a count request in a column of each each row of another requestmySQL Performant 请求在另一个请求的每一行的列中进行计数请求
【发布时间】:2009-05-15 22:48:05
【问题描述】:

我有一张桌子,上面有设备、他们的购买国家和购买日期。 我想检索: - 按国家/地区划分的设备总数 - 以及每个国家/地区自 1 个月以来购买的设备数量。

我使用这个请求来做这个:

SELECT countryCode, COUNT(*) AS sinceBeginning, (
SELECT COUNT(*) 
FROM mytable 
WHERE countryCode = table1.countryCode
AND buyedDate >= DATE_SUB( CURDATE( ) , INTERVAL 1 MONTH )
) AS sinceOneMonth
FROM mytable AS table1
GROUP BY countryCode
ORDER BY countryCode ASC";

但是每一行的“sinceOneMonth”列的内部计数对于性能来说是非常昂贵的。 有没有办法让这个请求更好? 谢谢。

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    使用 countrycode 和 buyeddate 的复合索引可能会提高您的性能,如果您在不传递 countrycode 的情况下从不直接查询 buyeddate,那么您可能会删除 countrycode 上的索引并将其替换为复合索引。

    以下查询可能会执行得更好,但不一定如此,它一如既往地取决于您的数据模式。

    SELECT countrycode, 
           SUM(in_month) AS this_month, 
           COUNT(*)      AS all_time
    FROM  ( 
             SELECT countrycode, 
                    buyedDate >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH) AS in_month 
             FROM mytable
          ) AS summary 
    GROUP BY countrycode;
    

    【讨论】:

    • 很好,您甚至可以消除子查询并编写 SUM(buyedDate >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH))
    【解决方案2】:

    是否有关于 (countrycode,buyedDate) 的索引?

    编辑:Steve Weet 的查询进一步简化:

    SELECT 
      countrycode
    , SUM(buyedDate >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH)) AS this_month
    , COUNT(*) AS all_time
    FROM  mytable
    GROUP BY countrycode
    

    【讨论】:

    • 每一个都是,但不是多列索引(countrycode,buyedDate)
    【解决方案3】:

    谢谢史蒂夫和安多马尔,

    随着请求:

    SELECT countrycode, COUNT( * ) AS sinceBeginning, SUM(buyedDate >= DATE_SUB( CURDATE( ) , INTERVAL 1 月 ) ) AS sinceOneMonth 来自我的表 WHERE 型号 =1 按国家代码分组;

    性能更好:原始请求需要 4 秒,现在需要 2 秒。 测试结果: countrycode sinceBeginning sinceOneMonth 1 500101 20184 表中有 600.000 行

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-25
      • 1970-01-01
      • 2019-01-02
      • 2019-06-24
      • 2017-11-25
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      相关资源
      最近更新 更多