Tôi sẽ tạo các chỉ mục sau (chỉ mục b-cây):
Các giao dịchanalytics(user_id, source, id)
transactions(analytics, status)
Điều này khác với gợi ý của Gordon.
Thứ tự của các cột trong chỉ mục là quan trọng.
Bạn lọc theo analytics.user_id
cụ thể , vì vậy trường này phải là trường đầu tiên trong chỉ mục. Sau đó, bạn nhóm theo analytics.source
. Để tránh sắp xếp theo source
đây sẽ là trường tiếp theo của chỉ mục. Bạn cũng tham khảo analytics.id
, vì vậy tốt hơn nên có trường này như một phần của chỉ mục, hãy đặt nó cuối cùng. MySQL có khả năng chỉ đọc chỉ mục và không chạm vào bảng không? Tôi không biết, nhưng nó khá dễ kiểm tra.
Lập chỉ mục về transactions
phải bắt đầu với analytics
, bởi vì nó sẽ được sử dụng trong JOIN
. Chúng tôi cũng cần 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