Несколько столбцов в одном индексе против нескольких индексов
Короткая версия моего вопроса - в чем разница между тремя индексами, каждый из которых индексирует один столбец, и одним индексом, индексирующим три столбца. Фон следует.
Я в основном программист, но должен выполнять работу администратора, потому что у нас нет администратора. Я сравниваю наши индексы с запросами, выполненными для конкретной таблицы. Таблица в виде 3 столбцов, по которым я часто фильтрую или получаю максимальное значение. В большинстве случаев запросы выглядят как
select max(col_a) from table where col_b = 'avalue'
или же
select col_c from table where col_b = 'avalue' and col_a = 'anothervalue'
Все столбцы независимо индексируются. Мой вопрос заключается в том, смогу ли я увидеть какую-либо разницу, если бы у меня был индекс, который индексировал вместе col_b и col_a, поскольку они могут появляться в предложении where вместе?
2 ответа
Для простых примеров таких вопросов легко сказать, что лучше. В реальных условиях ваш пробег может значительно отличаться в зависимости от других частей запроса.
В MySQL и, возможно, в других базах данных вы можете создать индекс для (col_b, col_a) и использовать его для обоих ваших запросов - любая левая часть многостолбцового индекса сама по себе является индексом. Индекс для (col1, col2, col3) также является индексом для (col1) и (col1, col2).
Чтобы ответить на ваш конкретный вопрос, я думаю, что вы извлекли бы значительную выгоду от совместного индексирования col_b и col_a. Если вы придерживаетесь только независимых индексов для каждого столбца, происходит одно из двух: либо база данных использует один из индексов, чтобы рассмотреть подмножество строк, соответствующих одному из значений, а затем сканирует их для второго значения, либо какое-то необычное объединение индексов на лету для эмуляции индекса в обоих столбцах. MySQL 4 будет делать первое, а MySQL может делать второе. В любом из этих случаев вы могли бы также создать комбинированный индекс, потому что вы ожидаете его использовать.
В MySQL в большинстве случаев один отдельный индекс работает быстрее. Вы можете увидеть некоторые тесты здесь:
http://www.mysqlperformanceblog.com/2008/08/22/multiple-column-index-vs-multiple-indexes/