2016-03-28 19 views
0

私は、特定のユーザの使用を撤回するために以下のクエリを使用したが、今はmysqlがテーブルのすべてのレコードを合計するという問題があります。すべてのレコードの合計を取得するのではなく、合計が500を超えるとクエリを停止するだけです。私は3つの異なる方法で疲れました。誰でも私に結果を達成するための最良の方法を提案することができます。それは500を超えるまで累計を示しmysqlクエリの最適化(sum関数を使用)

第一版クエリ

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

第二版クエリ

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; 

は何ということですあなたが欲しかった?それとも、最後の価値が欲しいですか?その場合は、LIMIT 1を使用する別のクエリの中に入れてください。

ORDER BYは必要ですか?

500を構成するアイテムを知る必要はありませんか?

合計が500未満の場合はどうしますか?

+0

'SET @tot:= 0; SELECT temp。 FROM TOTAL_USAGE (@usage_t SELECT:= acctinputoctets + acctoutputoctets usage_t AS、 @tot: = @tot + @usage_t/8388608 AS TOTAL_USAGE radacct WHEREユーザー名= 'fktmdipenlama' \t \t \t \t \t \t注文から BY DESC @usage_t \t \t \t \t \t \t)TEMP がTOTAL_USAGE <500 \t \t LIMIT 1 \t 0を有するものとして\t; '@Rick Jamesは、あなたが今まで述べてきたように、クエリを制限して順番を入れていくと、遅い4.453秒が実行されますが、速く実行されることはありません。 – Dipen

+0

制限時間なしの照会時間は0.797sです。 – Dipen

+0

あなたのように 'SELECT'を早く終了させる方法がないので、フルテーブルスキャンが必要です。 –