我有用戶交易表。我需要選擇一天內總交易超過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有人提出一個優化的查詢?
我有用戶交易表。我需要選擇一天內總交易超過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有人提出一個優化的查詢?
這樣做:
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,然後將之像下面
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
您可以在一個查詢相結合的聚合和過濾...
SELECT SUM(Amt) as amt
FROM users
WHERE date=date(...)
AND user_id=id
GROUP BY user_id
HAVING amt > 1
'1)這是浮動' '2)會做' '3)好' – Harikrishnan
對於貨幣金額,你應該至少切換到十進制數據類型。看到這[回答](http://stackoverflow.com/a/3768908/444013)。如果您試圖超級優化您的查詢,您應該切換到整數類型(例如bigint)並在顯示代碼中進行十進制轉換。 – schufty
,可以在您的查詢進行唯一的優化是通過對user_id列應用主鍵,以加快濾波。
至於發佈的其他答案表明,在過濾記錄上應用GROUP BY,它不會產生任何影響,因爲WHERE CLAUSE在SQL邏輯查詢處理階段中首先執行。 Check here
您可以使用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;
這將比OPs sql執行得更慢。因爲你已經在內部查詢中封裝了OP的查詢 – sumit
'選擇USER_ID,總和(AMT),如從表量,其中日期=日期( 「YMD」)基團由具有USER_ID量> 100000' –