次のインデックス(bツリーインデックス)を作成します:
analytics(user_id, source, id)
transactions(analytics, status)
これはゴードンの提案とは異なります。
インデックス内の列の順序は重要です。
特定のanalytics.user_id
でフィルタリングします 、したがって、このフィールドはインデックスの最初である必要があります。次に、analytics.source
でグループ化します。 。 source
による並べ替えを避けるため これは、インデックスの次のフィールドになります。 analytics.id
も参照します 、したがって、このフィールドをインデックスの一部として、最後に配置することをお勧めします。 MySQLはインデックスだけを読み取ることができ、テーブルに触れることはできませんか?わかりませんが、テストはかなり簡単です。
transactions
のインデックス analytics
から始める必要があります 、JOIN
で使用されるため 。 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