建议一个优化的mysql查询

时间:2013-12-13 04:58:56

标签: mysql sql query-optimization

我有用户事务的表。我需要选择一天内总交易量超过10万的用户。目前我正在做的是收集所有用户ID并执行

SELECT sum ( amt ) as amt from users where date = date("Y-m-d") AND user_id=id;

对于每个id和检查天气amt> 100k与否。

由于它是一个大表,因此需要花费大量时间来执行。有人建议使用优化查询吗?

5 个答案:

答案 0 :(得分:1)

这样做:

SELECT sum ( amt ) as amt, user_id from users
where date = date("Y-m-d") 
GROUP BY user_id
HAVING sum ( amt ) > 1;   ' not sure what Lakh is

答案 1 :(得分:1)

如何过滤记录1,然后应用如下的总和

select SUM(amt),user_id from (
SELECT  amt,user_id from users where user_id=id date = date("Y-m-d") 
)tmp 
group by user_id having sum(amt)>100000

答案 2 :(得分:1)

  1. 是什么数据类型?如果它只是一个基本的整数类型(例如int,long,number等),你应该考虑转换它。十进制类型比以前更快,但整数类型仍然更快。
  2. 考虑在date和user_id字段上添加索引(如果尚未添加)。
  3. 您可以在单个查询中合并聚合和过滤......

    SELECT SUM(Amt) as amt 
    FROM users 
    WHERE date=date(...) 
      AND user_id=id 
    GROUP BY user_id
    HAVING amt > 1
    

答案 3 :(得分:1)

您可以在查询中进行的唯一优化是在user_id列上应用主键以加快过滤。

就发布的其他答案而言,如果要对过滤的记录应用GROUP BY,则在SQL逻辑查询处理阶段首先执行WHERE CLAUSE将不会产生任何影响。 Check here

答案 4 :(得分:0)

您可以使用MySql子查询让MySql处理所有迭代。例如,您可以像这样构建查询:

select user_data.user_id, user_data.total_amt from 
(
    select sum(amt) as total_amt, user_id from users where date = date("Y-m-d") AND user_id=id
) as user_data
where user_data.total_amt > 100000;