Собрание
На встрече на прошлой неделе клиент обсуждал, как сделать важную страницу поиска быстрее.Страница ищет одну таблицу (12 столбцов, 20 миллионов строк), запрашивая значения (строки) в любом поле;он возвращает 50 строк (с разбиением на страницы), начиная с указанных критериев (каждый столбец может быть восходящим или нисходящим).Когда критерии не соответствуют существующим индексам, поиск замедляется, и клиент недоволен.
И затем - в середине встречи - полутехнический аналитик бросил этот вthe air: Почему бы нам не создать все возможные индексы на столе, чтобы все было быстро?
Я сразу ответил: "Нет, их слишком много, и это действительно сделает таблицумедленное изменение, поэтому нам нужно создать несколько хитроумно выбранных индексов, чтобы сделать это ".Мы закончили тем, что создали самые полезные, и страница теперь намного быстрее.Проблема решена.
Вопрос
Но все же ... Я продолжаю думать об этом вопросе и хочу лучше понять его, поэтому вот оно:
Теоретически, сколько возможных полезных индексов я могу создать для таблицы с N столбцами?
Я думаю, что полезными мы должны рассмотреть(Я могу ошибаться):
- Индексы, еще не охваченные другими: например, (a, b) не должны учитываться, если (a, b, c) включено.
- Для отображения нескольких строк (а не только равенства) восходящие и нисходящие индексы должны учитываться как отдельные, когда они являются частью составного индекса.То есть: (a) служит той же цели (DESC), но (a, b) служит другой цели, чем (DESC, b).
Итак, таблица с однимстолбец (a) может иметь только один индекс:
(a)
С двумя столбцами (a, b) я могу иметь четыре полезных индексов:
(a, b)
(b, a)
(a DESC, b)
(b DESC, a)
(a) -- already covered by #1
(b) -- already covered by #2
(a, b DESC) -- already coverred by #1 (reading index in reverse)
(b, a DESC) -- already covered by #2
(a DESC, b DESC) -- already covered by #3
(b DESC, a DESC) -- already covered by #4
(a DESC) -- already covered by #3
(b DESC) -- already covered by #4
С тремя столбцами (а, б, в):
(a, b, c)
(a, c, b)
(b, c, a)
(b, a, c)
(c, a, b)
(c, b, a)
...