Я использую MySQL 5.6 и имею таблицу, разбитую на столбец «network_date» типа DATE (каждый день имеет раздел, например, «2018-05-01», и каждый раздел содержит приблизительно 400 000 строк).Таблица имеет два составных индекса (не уникальных), которые также включают столбец network_date (сначала в порядке 6 столбцов).Это следующие индексы:
- _daily_ad_level_demand_idx: network_date, publisher_network_id, display_advertiser_id, business_rule_id, campaign_id, ad_id
- _daily_ad_level_supply_idid *, 100 *, издатель сети: publisher_idis 100: publisher_idisid: 100%
Однако, согласно команде EXPLAIN, при выполнении следующего запроса:
EXPLAIN EXTENDED SELECT
network_date,
SUM(COALESCE(ad_view, 0)) AS ad_view,
SUM(COALESCE(ad_spend_network, 0)) AS ad_spend_network,
SUM(COALESCE(ad_click, 0)) AS ad_click,
campaign_id,
display_advertiser_id,
publisher_network_id,
ad_id
FROM
daily_ad_level
WHERE
(publisher_network_id = 16020)
AND network_date BETWEEN STR_TO_DATE('2018-04-15 00:00:00.000000',
'%Y-%m-%d %H:%i:%S.%f') AND STR_TO_DATE('2018-05-12 23:59:59.999000',
'%Y-%m-%d %H:%i:%S.%f')
GROUP BY campaign_id, network_date, display_advertiser_id,
publisher_network_id, ad_id
индекс не выбирается оптимизатором и выполняется полное сканирование таблицы.Вы можете увидеть результат здесь: Вывод команды EXPLAIN с указанием 'network_date' в индексе
После некоторых исследований и размышлений над этим вопросом я решил удалить столбец 'network_date' из индексов- удаление разделов должно в любом случае выполнять необходимый поиск, так что, по-видимому, избыточно включать его в индекс.Повторное выполнение команды EXPLAIN показывает, что теперь выбирается индекс.Вы можете увидеть результат здесь: Вывод команды EXPLAIN с no 'network_date', включенным в индекс
С точки зрения длительности запроса производительность снизилась на , когдаоптимизатор выбрал индекс : от 9,75 с до 12,4 с ... Вопрос в том, почему ???
Анализ выходных данных команды объяснения first (безиспользование индекса), можно видеть, что столбцы «отфильтрованные» и «строки» имеют значения 50,00 и 4 474 281 соответственно.Может ли быть так, что оптимизатор делает вывод, что полное сканирование таблицы дешевле, чем использование индекса, который исключит только около половины строк?Если это так, я бы ожидал того же поведения во втором сценарии, а это не так: оптимизатор выбирает индекс, а запрос работает плохо.
Кто-нибудь знает, что может вызвать такое поведение?