Оптимизация индекса MySQL для микростратегии

У меня возникли некоторые проблемы с получением индекса для этого запроса (сгенерированного MicroStrategy):

SELECT     a11.method  method, sum(a11.call_count) CALLCOUNT
FROM    call_facts     a11
  JOIN    dimension a12 ON (a11.user_id = a12.user_id)
  JOIN service a13 ON (a11.service_id = a13.service_id)
WHERE   (a12.is_fraudulent = 0
  AND a12.is_test_account = 0
  AND a13.in_directory in ('yes')
  AND a11.date > '2011-10-01')
GROUP BY a11.method;  

В настоящее время у меня есть индексы на a12.is_fraudulent и a12.is_test_account. Объяснение показывает слияние индексов с использованием этих двух. a11 и a13 хороши с индексами. Какой индекс я могу создать, чтобы немного ускорить этот запрос?

Для справки, a12 имеет около 8 миллионов записей, 7,4 из них соответствуют случаям is_test_account = 0 and is_fraudulent = 0.


person Jericon    schedule 02.11.2011    source источник
comment
Почему у вас есть a13.in_directory в («да») вместо a13.in_directory = «да»?   -  person Aurelio De Rosa    schedule 02.11.2011
comment
Запрос генерируется некоторым программным обеспечением, которое использует моя группа бизнес-аналитики. Я не могу изменить запрос, поэтому я пытаюсь максимально оптимизировать индексы, чтобы повысить производительность. Сейчас этот запрос выполняется около 2 часов.   -  person Jericon    schedule 02.11.2011
comment
Я думаю, вам нужно добавить индекс в каждую часть where. Кстати, структуру Microstrategy SQL можно изменить.   -  person linpingta    schedule 07.03.2014


Ответы (1)


Составные индексы обычно дают более высокую производительность, чем несколько одностолбцовых индексов, объединенных в оптимизация слияния индексов.

Было бы полезно включить текущий отчет EXPLAIN для запрос, когда вы просите помощи с запросом.

Также было бы полезно опубликовать полный DDL (SHOW CREATE TABLE) для каждой таблицы, потому что "a11 и a13 хорошо работают с индексами", вероятно, неверно и не дает нам информации о том, какие индексы вы определили в этих таблицах.

Если мне нужно сделать какое-то предположение, я бы попробовал:

ALTER TABLE call_facts ADD INDEX (method, date, call_count);

ALTER TABLE dimension ADD INDEX (user_id, is_fraudulent, is_test_account);

ALTER TABLE service ADD INDEX (service_id, in_directory);
person Bill Karwin    schedule 02.10.2014