2013-12-13 56 views
1

我有用戶交易表。我需要選擇一天內總交易超過100000的用戶。目前我正在做的是收集所有用戶ID並執行建議優化的mysql查詢

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

每個ID和檢查天氣AMT> 100k的或沒有。

,因爲它是一個大表,它採取很多時間去execute.Can有人提出一個優化的查詢?

+0

'選擇USER_ID,總和(AMT),如從表量,其中日期=日期( 「YMD」)基團由具有USER_ID量> 100000' –

回答

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,然後將之像下面

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 
1
  1. 什麼數據類型是AMT?如果它不是基本的整數類型(例如int,long,number等),則應考慮將其轉換。十進制類型比以前更快,但整數類型仍然更快。
  2. 考慮在日期和user_id字段中添加索引(如果尚未添加索引)。
  3. 您可以在一個查詢相結合的聚合和過濾...

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

'1)這是浮動' '2)會做' '3)好' – Harikrishnan

+0

對於貨幣金額,你應該至少切換到十進制數據類型。看到這[回答](http://stackoverflow.com/a/3768908/444013)。如果您試圖超級優化您的查詢,您應該切換到整數類型(例如bigint)並在顯示代碼中進行十進制轉換。 – schufty

1

,可以在您的查詢進行唯一的優化是通過對user_id列應用主鍵,以加快濾波。

至於發佈的其他答案表明,在過濾記錄上應用GROUP BY,它不會產生任何影響,因爲WHERE CLAUSE在SQL邏輯查詢處理階段中首先執行。 Check here

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; 
+0

這將比OPs sql執行得更慢。因爲你已經在內部查詢中封裝了OP的查詢 – sumit