Saya akan membuat indeks berikut (indeks b-tree):
analytics(user_id, source, id)
transactions(analytics, status)
Ini berbeda dengan saran Gordon.
Urutan kolom dalam indeks itu penting.
Anda memfilter menurut analytics.user_id
tertentu , jadi bidang ini harus menjadi yang pertama di indeks. Kemudian Anda mengelompokkan menurut analytics.source
. Untuk menghindari pengurutan berdasarkan source
ini harus menjadi bidang indeks berikutnya. Anda juga mereferensikan analytics.id
, jadi lebih baik memiliki bidang ini sebagai bagian dari indeks, letakkan di akhir. Apakah MySQL mampu membaca hanya indeks dan tidak menyentuh tabel? Saya tidak tahu, tapi agak mudah untuk mengujinya.
Indeks pada transactions
harus dimulai dengan analytics
, karena akan digunakan dalam JOIN
. Kami juga membutuhkan 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