У меня есть этот запрос:
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 в таблице билетов.
ИНДЕКСЫ:
ОБЪЯСНИТЕ ПЛАН:
Я пытался использовать FORCE INDEX FOR JOIN, чтобы попытаться заставить его индексировать дату, но, похоже, он не понял намека.
dwDimDate — это измерение даты с днями года, поэтому в этом сценарии я думаю, что было бы быстро ограничиться 365 днями, а затем найти все билеты в этом диапазоне дат. В этот промежуток времени должно быть около 5 тысяч билетов.
Любая помощь будет принята с благодарностью. Я не знаю, как выяснить, какую стратегию использовать для удаления ВСЕХ поисков. Я хотел бы понять, как это делать в будущем, поэтому, если вы поможете научить меня ловить рыбу, это будет здорово.
EDIT В настоящее время выполнение запроса занимает 11 секунд, что может стать проблемой в рабочей среде.
LEFT
? - person Rick James   schedule 20.01.2018tickets
должны быть доставлены, когда есть более одного билета на данную дату?? - person Rick James   schedule 20.01.2018