SELECT * FROM dwDimDate d
LEFT JOIN tickets t FORCE INDEX FOR JOIN (idx_tickets_id_and_date) ON
DATE_FORMAT(t.ticket_date, '%Y%m%d') = d.date_key
LEFT JOIN sales s ON s.ticket_id = t.ticket_id
WHERE d.date_key BETWEEN 20130101 AND 20131231
GROUP BY d.date_key
を、私はそれを最適化する助けを探しています。私は説明プランを理解し、それに基づいて最適化することができるすべてを読んできましたが、MySQLがチケットテーブルでALLタイプのルックアップを使用するのを防ぐことはできません。
INDEXES:
EXPLAIN PLANを:
私はFORCE INDEX FORはのオフインデックスにそれを試してみて、取得するためにJOINを使用してみましたしかし、それはヒントを取っていないようです。
dwDimDateは、年の日数を持つ日付ディメンションです。このシナリオでは、365日に制限され、その日付範囲内のすべてのチケットを見つけるのが速くなると思います。その日付範囲内には約5Kのチケットしかないはずです。
ご協力いただければ幸いです。私は "ALL"ルックアップを削除するためにどの戦略を採用するかを理解する方法を知らない。私は将来このことをどうやって行うのかを理解したいので、もしあなたが「魚を教えてください」と助けてくれるなら、それは素晴らしいことです。
EDIT 現在、クエリの実行には11秒かかりますが、これは本番環境で問題となります。
本当に「LEFT」が必要ですか? –
これは不適切に形成されています - 指定された日付に対して複数のチケットが存在する場合、 'tickets'の値は配信されるべきですか? –