Краткая версия моего вопроса: в чем разница между тремя индексами, каждый из которых индексирует один столбец, и одним индексом, индексирующим три столбца. Предыстория следует.
Я в первую очередь программист, но мне приходится работать с администраторами баз данных, потому что у нас нет администраторов баз данных. Я сравниваю наши индексы с запросами, выполняемыми для конкретной таблицы. Таблица как 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 вместе?
Для простых примеров таких вопросов легко сказать, какой из них лучше. В реальных условиях ваш пробег может значительно отличаться в зависимости от других частей запроса.
В 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/