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