Сканирование таблицы и добавление индекса - что быстрее?
У меня есть таблица со многими миллионами строк. Мне нужно найти все строки с определенным значением столбца. Этот столбец отсутствует в индексе, поэтому результаты сканирования таблицы.
Но будет ли быстрее добавить индекс со столбцом во главе (после простого ключа), выполнить запрос, а затем удалить индекс?
Я не могу добавить индекс навсегда, так как пользователь указывает, какой столбец он ищет.
8 ответов
Два вопроса для размышления:
- Сколько столбцов может быть назначено для запроса?
- Данные часто меняются? Много этого?
Если у вас есть небольшое количество столбцов-кандидатов, и данные не сильно меняются, то вы можете рассмотреть возможность добавления постоянного индекса для любого или даже для всех столбцов-кандидатов.
" Богохульство! ", Слышу я. Большинство источников говорят вам "никогда" индексировать каждый столбец таблицы, но этот совет основан на общем предположении о том, что таблицы часто изменяются.
Вы будете платить цену в дополнительном хранилище, а также снижение производительности при изменении данных.
Насколько маленький маленький и сколько стоит, и стоит ли компромисс? Невозможно сказать, что такое монастырь, потому что "слишком медленный" обычно является субъективным измерением.
Вам нужно будет попробовать это, измерить размер ваших индексов и затем их влияние на результаты поиска. Вы должны будете сбалансировать затраты с увеличением удовлетворенности ваших клиентов.
[Добавлено] Ах, еще одна вещь: временные индексы не только физически медленнее, чем сканирование таблицы, но они могут разрушить ваш параллелизм. Для повторной индексации таблицы обычно (всегда?) Требуется полная блокировка таблицы, поэтому фактически только один пользовательский поиск может быть выполнен за один раз.
Удачи.
Я не администратор баз данных, но я думаю, что для построения индекса все равно потребуется сканирование таблицы.
Если в этом столбце не будет несколько запросов, я бы не рекомендовал создавать индекс.
Лучше всего проверить планы объяснения / время выполнения для обоих способов, хотя!
Как и все остальные, наверняка было бы не так быстро добавить индекс, как было бы сделать полное сканирование этого столбца.
Однако я бы предложил отслеживать шаблон запроса и выяснить, какие столбцы (столбцы) ищутся чаще всего, и добавить индексы хотя бы для них. Вы можете обнаружить, что 3-4 индекса ускоряют 90% ваших запросов.
Добавление индекса требует сканирования таблицы, поэтому, если вы не можете добавить постоянный индекс, это звучит так, как будто одно сканирование будет (немного) быстрее.
Это не будет Создание индекса сложнее, чем простое сканирование столбца, даже если вычислительная сложность такая же.
Тем не менее, сколько колонок у вас есть? Вы уверены, что не можете просто создать индекс для каждого из них, если время запроса для одного поиска слишком велико?
Ваше решение не будет масштабироваться, если вы не добавите постоянный индекс в каждый столбец со всеми столбцами, которые возвращаются в запросе в списке включенных столбцов (закрывающий индекс). Эти индексы будут очень большими, а вставка и обновление этой таблицы будет немного медленнее, но у вас нет большого выбора, если вы разрешаете пользователю произвольно выбирать столбец поиска.
Сколько там столбцов? Как часто данные обновляются? Как быстро должны выполняться вставки и обновления? Существуют компромиссы, в зависимости от ответов на эти вопросы. Сделайте много экспериментов и испытаний, чтобы точно знать, как все будет работать.
Но к исходному вопросу добавление и удаление индекса для одного запроса выгодно только в том случае, если вы выполняете более одного выбора во время запроса (например, выбор находится в подзапросе, который запускается для каждой возвращаемой строки).
Нет, это не будет быстрее. Что было бы быстрее - это просто добавить индекс и оставить его там!
Конечно, может быть нецелесообразно индексировать каждый столбец, но, опять же, это возможно. Как данные добавляются в таблицу?
Это зависит от сложности вашего запроса. Если вы извлекаете данные один раз, сканирование таблицы выполняется быстрее. Однако, если вы возвращаетесь к таблице более одного раза для связанной информации в одном и том же запросе, индекс быстрее.
Другой связанной стратегией является сканирование таблицы и помещение всех данных во временную таблицу. Затем индексируйте THAT, и затем вы сможете выполнять все последующие операции выбора, группировки и многие другие запросы в подмножестве индексированных данных. Преимущество заключается в том, что поиск соответствующей информации в связанных таблицах с использованием временной таблицы НАМНОГО быстрее.
Однако в наши дни пространство дешевое, поэтому вам лучше всего разобраться, как ваши пользователи фактически используют вашу систему, и добавить индексы для этих частых столбцов. Я еще не видел, чтобы пользователи использовали ВСЕ параметры поиска ВСЕ время.