优化MySQL查询

时间:2012-04-16 16:29:37

标签: mysql optimization

我想运行一个生成广告系列收入报告的查询。有2个表 会员和付款。

members (id, campaign_code)
payments (id, member_id, amount)

我想创建一个按campaign_code分组的表格,即格式为

campaign_code, member_count, total_revenue 

我将所有广告系列放入一个数组并运行它,

SELECT sum( amount ) AS amt
FROM (members
INNER JOIN payments 
    ON payments.member_id = members.id
)
WHERE campaign_code = 'XX'

这需要很多时间。无论如何要优化它或在单个查询中执行它?

3 个答案:

答案 0 :(得分:1)

正如您所说,您需要汇总所有广告系列代码,请尝试此

SELECT m.campaign_code , count(p.member_id) AS member_count,
  SUM( amount ) AS total_revenue
FROM members m, payments p
WHERE p.member_id = m.id
GROUP BY campaign_code;

确保按函数

读取mysql组

答案 1 :(得分:0)

使用

where campaing_code in ('XX','YY','ZZ','AA','BB')

并且有一个关于campaing_code的索引

答案 2 :(得分:0)

付款(id,member_id,金额) 我想创建一个按campaign_code分组的表格,即格式为

campaign_code,member_count,total_revenue 我将所有广告系列放入一个数组并运行它,

select
      m.Campaign_Code,
      count( distinct p.member_id) as Members,
      count(*) as PaymentEntries,
      sum( p.amount ) as TotalRevenue
   from
      members m
         join Payments p
            on m.id = p.member_id
   where
      m.campaign_code = 'XX'

如果您想要所有广告系列,只需删除WHERE子句即可。你在评论中提到表DO有索引,但我会确保成员表有campaign_code索引,而付款有member_id索引。

此查询将列出已贡献的不同成员,贡献总数(如果一个或多个成员多次贡献),以及所有贡献的总数。