如何优化多个子查询?

时间:2015-04-28 13:20:36

标签: mysql sql

我正在尝试从mysql获取一些用户统计信息。类似的东西:

  • 10%用户购买了pepsi
  • 20%是女性
  • 40%在美国

第一步是获取所有用户从百事可乐制造商处购买东西的清单。

此查询在不到1秒的时间内运行良好,并返回用户ID列表。

SELECT DISTINCT idUser FROM checkout_item INNER JOIN (
  SELECT id FROM product WHERE manufacturer = "pepsi"
) AS chkItem ON chkItem.id = checkout_item.idProduct

现在我使用此列表来获取信息。刚刚在上面添加了一个查询:

SELECT
  name, gender
FROM users INNER JOIN(

  SELECT DISTINCT idUser FROM checkout_item INNER JOIN (   //
    SELECT id FROM product WHERE manufacturer = "pepsi"    // same query above
  ) AS chkItem ON chkItem.id = checkout_item.idProduct     //

) AS usr ON usr.idUser = users.id

此查询正常,但需要23秒。有没有办法优化这个?

也许使用WHERE,JOIN或更改mysql RAM配置?

3 个答案:

答案 0 :(得分:1)

这是您第一次查询的重写。也许你可以弄清楚其余部分。

SELECT DISTINCT idUser 
           FROM checkout_item i
           JOIN product p 
             ON p.id = i.idproduct
          WHERE p.manufacturer = 'pepsi'

答案 1 :(得分:0)

试试这个: 选择名称,性别 来自checkout_item c INNER JOIN(从产品WHERE manufacturer =“pepsi”中选择ID)p ON p.id = C.idProduct INNER JOIN用户u on C.idUser = u.Id

还要考虑在checkout_item字段idProduct

上添加索引

答案 2 :(得分:0)

以下内容应该为您提供idUsers的总数,以及女性idUsers的总数(显然我不知道您使用什么作为性别标志,所以我只使用'f')。

SELECT  COUNT(DISTINCT idUser) AS Total,
    COUNT(DISTINCT CASE WHEN gender = 'f' then idUser else null end) AS women
FROM    checkout_item ci
    inner join product p
        on p.id=ci.idProduct
WHERE   p.manufacturer = 'pepsi'

从那里获得你需要的数据应该是基本的数学。

通常我不建议使用'DISTINCT',但是对于你的数据不太了解,这是制作有用的东西的快捷方式。

希望有所帮助!