2016-01-27 3 views
3

У меня есть таблица MySQL с ~ 17M строк, где я в конечном итоге выполняю множество запросов на агрегирование.Настроить лучший вариант выбора для MySQL

Для этого примера позволяет сказать, что у меня есть index_on_b, index_on_c, compound_index_on_a_b, compound_index_on_a_c

я пытаюсь запустить запрос объяснить

EXPLAIN SELECT SUM(revenue) FROM table WHERE a = some_value AND b = other_value 

И я считаю, что выбранный индекс index_on_b, но когда я использую запрос подсказка

SELECT SUM(revenue) FROM table USE INDEX(compound_index_on_a_b) 

Запрос выполняется быстрее. Могу ли я что-нибудь сделать в конфигурации MySQL, чтобы MySQL сначала выбрал составные индексы?

+0

Просьба представить фактический 'SHOW CREATE TABLE' и' SELECT'. Там могут быть тонкие вещи, такие как несоответствия типа данных, мешающие. Также 'EXPLAIN SELECT ...' –

ответ

1

Есть 2 возможных маршрутов вы можете взять с собой:

A) Процесс разрешения индекса, когда в соответствии с оптимизатором все равны на основе порядка индексы создаются в Вы можете бросить index_b и воссоздать его. и проверить, был ли оптимизатор в сценарии, где он просто думал, что они были одинаковыми.

Или

B) Использование optimizer_search_depth (см https://mariadb.com/blog/setting-optimizer-search-depth-mysql). Изменяя этот параметр, вы определяете, сколько усилий оптимизатору разрешено тратить на план запроса, и это может привести к значительно лучшему решению использовать комбинированный индекс.

+0

Как насчет мощности индекса и обновления с помощью таблицы анализа? – Shadow

+0

@Shadow: Как используется мощность, является частью процесса оптимизатора, и, насколько я знаю, на него не влияют. Таблица анализа только сохраняет актуальность (это не плохая идея: лучше всего обновить эту информацию). –

+0

@NorbertvanNobelen благодарит за ответ. Я смог найти множество вариантов для настройки алгоритма выбора плана запроса, но я все еще не могу понять, что заставляет MySQL выбирать слияние индексов или более крупные индексы над составным индексом. – OneChillDude

0

Возможное объяснение:

Если a имеет одинаковое значение во всей таблице, то INDEX(b) на самом деле лучше, чем INDEX(a,b). Это связано с тем, что первое меньше, поэтому быстрее работать. Обратите внимание, что оба возвращают одинаковое количество строк, даже без дополнительной проверки a.

Просьба:

SHOW CREATE TABLE 
SHOW INDEXES -- to see cardinality 
EXPLAIN SELECT 
+0

Возможно, я не задал вопрос правильно, но в этом случае 'INDEX (a, b)', безусловно, будет в 100 раз быстрее (обнаружен с помощью экспериментов) – OneChillDude

Смежные вопросы