2016-03-28 15 views
0

我有一個情況,我使用下面的查詢來退回某些用戶的使用情況,但問題是,現在mysql會從表中總結所有記錄。而不是獲得所有記錄的總和,我只想在總和大於500時停止查詢。我累了3種不同的方式。任何人都可以建議我哪一種是達到結果的最佳方式。mysql查詢優化(使用求和函數)

1版查詢

SELECT 
(SUM(radacct.acctinputoctets) + SUM(radacct.acctoutputoctets))/8388608 AS total_usage 
FROM `radacct` 
WHERE username ='fktmbishals' 

第2版查詢

SELECT 
if ((SUM(radacct.acctinputoctets) + SUM(radacct.acctoutputoctets))/8388608 > 500 , 500, 0) AS total_usage 
FROM `radacct` 
WHERE username ='fktmbishals' 

第三版查詢

SELECT 
(SUM(temp_radacct.acctinputoctets) + SUM(temp_radacct.acctoutputoctets))/8388608 AS total_usage 
FROM (
    SELECT 
radacct.acctinputoctets,radacct.acctoutputoctets 
FROM `radacct` 
WHERE username ='fktmbishals' 
LIMIT 10 
) as temp_radacct 
+0

表中該行用戶有多少行? –

+0

@PaulSpiegel有超過10,00000條記錄 – Dipen

+0

所有的查詢都做了不同的事情....讓我們知道你想要什麼....可能會有比你更好的選擇。 –

回答

2
SET @tot := 0; 
SELECT total_usage 
    FROM 
     (SELECT @usage := acctinputoctets + acctoutputoctets AS usage, 
       @tot := @tot + @usage/8388608 AS total_usage 
      FROM radacct 
      WHERE username ='fktmbishals' 
      ORDER BY ?? 
    ) x 
    HAVING Total < 500; 

,顯示運行總計直到超過500是什麼你自找的?或者你想要最後一個值?如果是這樣,將其放入另一個使用LIMIT 1的查詢中。

你需要什麼ORDER BY

你不需要知道什麼項目組成了500?

如果整個總數小於500,你想要什麼?

+0

'SET @tot:= 0; SELECT temp。TOTAL_USAGE FROM (SELECT @usage_t:= acctinputoctets + acctoutputoctets AS usage_t, @tot:= @tot + @usage_t/8388608 AS TOTAL_USAGE FROM radacct WHERE用戶名= 'fktmdipenlama' \t \t \t \t \t \t ORDER BY \t \t \t \t \t \t @usage_t DESC )作爲臨時 具有TOTAL_USAGE <500 \t \t LIMIT 1 \t \t; '@Rick James我按照你現在所說的那樣做了,當我通過查詢包含限制和順序時,運行速度變慢了4.453秒,但沒有運行得更快。 – Dipen

+0

查詢時間沒有限制,排序是0.797s – Dipen

+0

由於沒有辦法像過早那樣終止'SELECT',所以需要全表掃描。 –