Каковы недостатки наличия большого количества индексов?

Недавно я ускорил сложный запрос на порядок, предоставив SQLite хороший индекс для работы. Такие результаты заставляют меня задуматься, следует ли мне индексировать множество других полей, которые обычно используются для предложений JOIN или ORDER BY. Но я не хочу переусердствовать и получить неприятные последствия: я предполагаю, что должны быть какие-то причины не создавать индексы, иначе каждое поле будет проиндексировано по умолчанию.

В этом случае я использую SQLite, но, конечно, советы, не зависящие от СУБД, также приветствуются.


person Andrew Watt    schedule 18.04.2009    source источник


Ответы (4)


Индексы замедляют вставку и обновление (что может стать серьезной проблемой при блокировке) и занимают место на диске. Вот и все.

person chaos    schedule 18.04.2009
comment
Это покрывает это. Не забывайте, что вам нужны правильные индексы для хорошей производительности вставки/обновления/удаления. Как и все вещи, это баланс. - person Michael Haren; 19.04.2009
comment
вставки не выигрывают от индексов... Обновления и удаления требуют нахождения соответствующих строк, поэтому они выигрывают от индексов для этого шага, но тогда, если у вас много индексов, даже это преимущество может быть сведено на нет. Как говорится, все дело в балансе :) - person MatBailie; 20.04.2009

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

Используйте эти факторы, чтобы решить, нужен ли вам индекс.

Обычно можно создавать индексы, которые НИКОГДА не будут использоваться - например, индекс для (не нулевого) поля только с двумя возможными значениями почти наверняка будет бесполезен.

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

person MarkR    schedule 18.04.2009
comment
Индексация поля с двумя значениями может (иногда) быть полезной, когда распределение чрезвычайно неравномерно — и база данных знает это через статистику. - person Mike Woodhouse; 19.04.2009

Чтобы протестировать ваше конкретное приложение, вы можете поставить «EXPLAIN QUERY PLAN» перед любым запросом, который вы выполняете, и проверить результаты. Он покажет вам, где он использует или не использует индексы.

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

Объяснение SQLite

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

person Jared Miller    schedule 19.04.2009

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

Это зависит от соотношения чтения и записи в таблице и от того, как часто индекс фактически используется для ускорения запроса.

person Walter Mitty    schedule 19.04.2009
comment
Хм, в зависимости от таблицы и индексируемых полей стоимость дискового пространства не всегда тривиальна. У меня было много случаев, когда сумма индексного пространства была вдвое (или больше), чем сумма табличного пространства... - person MatBailie; 20.04.2009
comment
Согласен с Демсом; для узкой таблицы некластеризованный индекс может иметь сравнимый размер с таблицей. Скажем, индекс стоит половину дискового пространства самой таблицы; таблица с шестью индексами занимает на диске в четыре раза больше места, чем неиндексированная. Кластерные индексы в основном бесплатны. - person Steve Cooper; 10.12.2009
comment
Нет, стоимость индекса в дисковом пространстве обычно не является тривиальной. Индексы могут занимать много места. - person MarkR; 10.12.2009