Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie kann man diese MySQL-Abfrage optimieren? Millionen Zeilen

Ich würde die folgenden Indizes (B-Tree-Indizes) erstellen:

analytics(user_id, source, id) 
transactions(analytics, status)

Dies weicht von Gordons Vorschlag ab.

Die Reihenfolge der Spalten im Index ist wichtig.

Sie filtern nach bestimmter analytics.user_id , also muss dieses Feld das erste im Index sein. Dann gruppieren Sie nach analytics.source . Um eine Sortierung nach source zu vermeiden Dies sollte das nächste Feld des Index sein. Sie verweisen auch auf analytics.id , daher ist es besser, dieses Feld als Teil des Index zu haben, setzen Sie es an letzter Stelle. Ist MySQL in der Lage, nur den Index zu lesen und die Tabelle nicht zu berühren? Ich weiß es nicht, aber es ist ziemlich einfach zu testen.

Index auf transactions muss mit analytics beginnen , weil es im JOIN verwendet werden würde . Außerdem benötigen wir status .

SELECT 
    analytics.source AS referrer, 
    COUNT(analytics.id) AS frequency, 
    SUM(IF(transactions.status = 'COMPLETED', 1, 0)) AS sales
FROM analytics
LEFT JOIN transactions ON analytics.id = transactions.analytics
WHERE analytics.user_id = 52094 
GROUP BY analytics.source 
ORDER BY frequency DESC 
LIMIT 10