Сканирование таблицы и добавление индекса - что быстрее? - PullRequest
6 голосов
/ 27 августа 2008

У меня есть таблица с миллионами строк. Мне нужно найти все строки с определенным значением столбца. Этот столбец отсутствует в индексе, поэтому результаты сканирования таблицы.

Но будет ли быстрее добавить индекс со столбцом в заголовке (после простого ключа), выполнить запрос, а затем удалить индекс?

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

Ответы [ 8 ]

9 голосов
/ 27 августа 2008

Два вопроса для размышления:

  1. Сколько столбцов можно назначить для запроса?
  2. Часто ли данные меняются? Много это?

Если у вас есть небольшое число столбцов-кандидатов и данные не меняются много , то вы можете рассмотреть возможность добавления постоянного индекса для любого или даже для всех столбец кандидатов.

" Богохульство! ", слышу я. Большинство источников говорят вам «никогда» индексировать каждый столбец таблицы, но этот совет основан на общем предположении, что таблицы часто изменяются.

Вы будете платить цену в дополнительном хранилище, а также снижение производительности при изменении данных.

Насколько мала мала и сколько стоит лот , и стоит ли компромисс? Невозможно сказать, что такое монастырь, потому что «слишком медленный» обычно является субъективным измерением.

Вам нужно будет попробовать, измерить размер ваших индексов и затем их влияние на результаты поиска. Вы должны будете сбалансировать затраты с увеличением степени удовлетворения ваших клиентов.

[Добавлено] О, еще одна вещь: временные индексы не только физически медленнее, чем сканирование таблицы, но и разрушают ваш параллелизм. Для повторной индексации таблицы обычно (всегда?) Требуется полная блокировка таблицы, поэтому в действительности за один раз можно выполнить только один поиск пользователя.

Удачи.

8 голосов
/ 27 августа 2008

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

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

Лучше всего проверить планы объяснения / время выполнения для обоих способов, хотя!

3 голосов
/ 27 августа 2008

Как уже говорили, наверняка было бы не так быстро добавить индекс, как при полном сканировании этого столбца.

Однако я бы посоветовал отслеживать шаблон запроса и выяснить, какие столбцы (столбцы) ищутся чаще всего, и добавить индексы хотя бы для них. Вы можете обнаружить, что 3-4 индекса ускоряют 90% ваших запросов.

2 голосов
/ 27 августа 2008

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

Сколько там столбцов? Как часто данные обновляются? Как быстро должны выполняться вставки и обновления? Существуют компромиссы, в зависимости от ответов на эти вопросы. Проведите много экспериментов и испытаний, чтобы точно знать, как все будет работать.

Но к исходному вопросу добавление и удаление индекса для цели одного запроса выгодно только в том случае, если во время запроса выполняется более одного выбора (например, выбор находится в подзапросе, который запускается для каждая строка возвращается).

2 голосов
/ 27 августа 2008

Это зависит от сложности вашего запроса. Если вы извлекаете данные один раз, сканирование таблицы выполняется быстрее. Однако, если вы возвращаетесь к таблице более одного раза для связанной информации в одном и том же запросе, индекс быстрее.

Другая связанная стратегия заключается в сканировании таблицы и помещении всех данных во временную таблицу. Затем индексируйте THAT, и затем вы сможете выполнять все последующие операции выбора, группировки и многие другие запросы для подмножества индексированных данных. Преимущество заключается в том, что поиск связанной информации в связанных таблицах с использованием временной таблицы НАМНОГО быстрее.

Однако в наши дни пространство дешевое, поэтому вам, вероятно, лучше обойтись, изучив, как ваши пользователи на самом деле используют вашу систему, и добавив индексы для этих частых столбцов. Я еще не видел, чтобы пользователи использовали ВСЕ параметры поиска ВСЕ время.

2 голосов
/ 27 августа 2008

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

Тем не менее, сколько у вас столбцов? Вы уверены, что не можете просто создать индекс для каждого из них, если время запроса для одного поиска слишком велико?

2 голосов
/ 27 августа 2008

Нет, это не было бы быстрее. Что было бы быстрее - это просто добавить индекс и оставить его там!

Конечно, может быть нецелесообразно индексировать каждый столбец, но, опять же, возможно. Как данные добавляются в таблицу?

2 голосов
/ 27 августа 2008

Добавление индекса требует сканирования таблицы, поэтому, если вы не можете добавить постоянный индекс, кажется, что одно сканирование будет (немного) быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...