2016-03-28 5 views
0

Ich habe eine Situation, die ich unter Abfrage verwendet haben, um die Verwendung bestimmter Benutzer in den Ruhestand, aber das Problem ist, dass jetzt mysql alle Datensätze aus der Tabelle summiert. Anstatt die Summe aller Datensätze zu erhalten, will ich nur die Abfrage stoppen, wenn die Summe größer als 500 ist. Ich habe 3 verschiedene Wege gemeistert. Kann mir jemand vorschlagen, was der beste Weg ist, um das Ergebnis zu erreichen.mysql Abfrageoptimierung (mit Summenfunktion)

1. Versionsabfrage

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

2. Versionsabfrage

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

3. Versionsabfrage

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

Wie viele Zeilen sind in der Tabelle für diesen Benutzer? –

+0

@PaulSpiegel Es gibt mehr als 10,00000 Datensätze – Dipen

+0

alle Ihre Abfragen machen etwas anderes .... lassen Sie uns wissen, was Sie wollen .... möglicherweise gibt es bessere Option als Sie versucht haben. –

Antwort

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; 

, dass die laufende Summe zeigt, bis sie 500 übersteigt Ist das, was du wolltest? Oder wolltest du den letzten Wert? Wenn dies der Fall ist, fügen Sie das in eine andere Abfrage ein, die LIMIT 1 verwendet.

Was ORDER BY benötigen Sie?

Sie müssen nicht wissen, welche Artikel die 500 bilden?

Was möchten Sie, wenn die gesamte Summe weniger als 500 ist?

+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 username = 'fktmdipenlama' \t \t \t \t \t \t ORDER BY \t \t \t \t \t \t @usage_t DESC ) als temporäre Mit TOTAL_USAGE <500 \t \t LIMIT 1 \t \t; '@Rick James ich habe getan, wie Sie jetzt gesagt haben, wenn ich Limit und Auftrag durch die Abfrage enthält, läuft langsamer 4.453s, aber ohne es läuft schneller. – Dipen

+0

Abfragezeit ohne Limit und Reihenfolge von ist 0.797s – Dipen

+0

Da es keine Möglichkeit gibt, ein SELECT vorzeitig zu beenden, ist ein vollständiger Tabellenscan erforderlich. –