2016-10-13 3 views
0

Wie kann ich die Leistung der unten Abfrage verbessern? Welche Indizes könnten helfen?MySQL Indizes auf Abfrage mit Where, GroupBy und OrderBy Klauseln

SELECT platform, country, Source, window, 
Round(SUM(ProjectedARPI*PlayerCount)/SUM(PlayerCount), 2) AS ProjectedARPI, 
Round(SUM(ProjectedARPIOrganicLow*PlayerCount)/SUM(PlayerCount), 2) AS ProjectedARPIOrganicLow, 
Round(SUM(ProjectedARPIOrganicMed*PlayerCount)/SUM(PlayerCount), 2) AS ProjectedARPIOrganicMed, 
Round(SUM(ProjectedARPIOrganicHigh*PlayerCount)/SUM(PlayerCount), 2) AS ProjectedARPIOrganicHigh, 
SUM(PlayerCount) AS PlayerCount, SUM(PayerCount) AS PayerCount, 
CASE WHEN(SUM(PlayerCount) > 500 AND SUM(PayerCount) > 10) THEN TRUE ELSE FALSE END AS isSignificant, 
ProjectionDate, 
min(CohortRangeLow) as CohortRangeLow, 
max(CohortRangeHigh) as CohortRangeHigh 
FROM web_synch.UI_data 
WHERE PlayerCount > 0 AND ProjectionDate BETWEEN '2015-07-25' AND '2016-10-25' AND window = 365 
GROUP BY Platform, country, source, ProjectionDate 
ORDER BY Platform, source, ProjectionDate; 
+2

Sie können mit einigen versuchen, die Abfrage zu formatieren. Ich verstehe Sie sind neu auf der Website, aber die Abfrage ist ein Durcheinander. Wenn es nicht gelesen werden kann, kann es nicht verbessert werden. –

+1

Danke Bobski für die Bearbeitung des Posts. – Mayank

+0

mein bitte fügen Sie immer 4 Leerzeichen vor Code – BobSki

Antwort

0

Für diese Abfrage im Grunde Ihre einzige Hoffnung Indizes in Verwendung ist entweder: UI_data(window, ProjectionDate, PlayerCount) oder UI_data(window, PlayerCount, ProjectionDate). Was besser ist, hängt davon ab, welche weniger Datensätze ausgewählt werden. . . Ich denke, der erste ist besser.

+0

Danke Gordon für die Antwort! Wollen Sie nur verstehen, warum ein Index für GROUP-BY-Spalten hier funktioniert? – Mayank

+0

(Pls ignorieren obigen Kommentar) Danke Gordon für die Antwort! Wollen Sie nur verstehen, warum ein Index für GROUP-BY-Spalten hier nicht funktioniert? – Mayank

+0

Zusammen mit Ihrem vorgeschlagenen Index für die WHERE-Klausel habe ich auch einen Index für die GROUP-BY-Klausel hinzugefügt. Bei der Ausführung der Abfrage wurde jedoch nur der Index für die WHERE-Klausel und nicht der Index für die GROUP-Klausel verwendet. – Mayank

0

Ich schlage vor, dass dies der beste Index:

INDEX(window,   -- first because "=" 
     ProjectionDate -- range 
    )     -- nothing after range will be looked at 

Dies hat einen leichten Vorteil gegenüber dem 3-Spalten-Index zuvor vorgeschlagen, dass in dem Index etwas kleiner sein wird.

Weitere Diskussion: Index cookbook.

Ich erwarte, dass es zwei Arten geben wird - eine für GROUP BY, dann eine für ORDER BY. Es würde ein wenig schneller laufen, wenn Sie die ORDER BY und die GROUP BY Liste identisch machen.

Möglicher Fehler: Wenn ProjectionDate ein DATE Datentyp ist, dann ist der Bereich drei Monate plus ein Tag. Empfehlen Sie dieses Muster:

ProjectionDate >= '2015-07-25' 
AND ProjectionDate < '2016-07-25' + INTERVAL 3 MONTH 
+0

Danke Rick für das Feedback.Ich werde versuchen, sowohl Ihre Vorschläge und sehen Sie die Verbesserungen.Auch wird auf die mögliche Fehler überprüfen, die Sie erwähnt. – Mayank

Verwandte Themen