Ответ 1
Индексы замедляют вставки и обновления (что может стать действительно серьезной проблемой при блокировке) и стоить дисковое пространство. Это в значительной степени это.
Недавно я ускорил сложный запрос на порядок, предоставив SQLite хороший индекс для работы. Результаты, подобные этому, заставляют меня задаться вопросом, следует ли мне индексировать множество других полей, которые обычно используются для предложений JOINs или ORDER BY. Но я не хочу переусердствовать и иметь на него обратные последствия: я предполагаю, что должны быть некоторые причины не создавать индексы, или каждое поле будет индексироваться по умолчанию.
В этом случае я использую SQLite, но, конечно же, приветствуются рекомендации DBMS-agnostic.
Индексы замедляют вставки и обновления (что может стать действительно серьезной проблемой при блокировке) и стоить дисковое пространство. Это в значительной степени это.
Индексы используют дисковое пространство для хранения и требуют времени для создания и обслуживания. Неиспользованные не приносят никакой пользы. Если есть много индексов-кандидатов для запроса, запрос может быть замедлен, если сервер выбрал "неправильный" для запроса.
Используйте эти факторы, чтобы решить, нужен ли вам индекс.
Обычно можно создавать индексы, которые НИКОГДА не будут использоваться - например, и индекс в поле (не пустое) с двумя возможными значениями почти наверняка будет бесполезным.
Вам нужно объяснить свои собственные запросы приложений, чтобы убедиться, что часто выполняемые используют по возможности разумные индексы и не создают больше индексов, чем требуется для этого.
Чтобы протестировать ваше приложение, вы можете поставить "EXPLAIN QUERY PLAN" перед любым запросом, который вы запускаете, и проверить результаты. Он покажет вам, где он или не использует индексы.
Таким образом вы можете определить, где вы могли бы использовать больше индексов и где они не будут иметь значения.
Я использую SqliteSpy для запроса тестового запроса, который, кажется, вызывает проблемы.
Стоимость индекса на дисковой площади обычно тривиальна. Стоимость дополнительных записей для обновления индекса при изменении таблицы часто бывает умеренной. Стоимость дополнительной блокировки может быть серьезной.
Это зависит от отношения чтения и записи в таблице и от того, как часто индекс используется для ускорения запроса.