Ответ 1
Вообще говоря:
1. Не добавляйте индекс, если он вам действительно не нужен.
Каждый индекс замедляет запись...
2. Будет использован индекс для предложений where:
-- index on foo (bar)
select bar from foo where bar = :bar;
По тому же признаку он будет использоваться в ссылках внешнего ключа (в обеих таблицах).
-- index on foo (bar) if baz (bar) is frequently updated/deleted.
create table foo (bar references baz (bar));
3. Индекс будет использоваться для сортировки, особенно когда он привязан к пределу:
-- index on foo (bar)
select bar from foo order by bar limit 10;
4. Многоколоночные индексы иногда полезны, когда применяются оба варианта: 2. и 3.
В этом случае ставьте сначала условия where, а ключ сортировки - последний:
-- index on foo (baz, bar)
select bar from foo where baz between :baz1 and :baz2 group by bar;
5. Обновляйте статистику своей таблицы.
Если статистические данные таблицы являются мусором, существует небольшая вероятность того, что оптимизатор будет использовать ваши индексы. Вручную очистите/проанализируйте вашу базу данных, если это необходимо.
6. Использование индекса зависит от перераспределения таблицы.
Пройдя определенный порог извлеченных строк, полное сканирование таблицы будет быстрее. Если ваш индекс находится в логическом поле, которое более или менее разделяет вашу таблицу на две части, он никогда не будет использоваться.
Аналогичным образом, если ваши данные хранятся таким образом, что сканирование индекса, вероятно, в конечном итоге приведет к случайному доступу к почти всегда применимой странице диска для этой таблицы, планировщик предпочтет полное сканирование таблицы.
7. Рассмотрите частичные/экспрессивные индексы, когда они доступны.
Если у вас есть поле с тем же значением, за исключением 10% ваших строк, рассмотрите частичный индекс по нему (т.е. где это не значение). Это приводит к гораздо меньшему индексу, не мешая его фактической полезности.
Если вы постоянно запрашиваете выражение, примененное к вашему столбцу, и ваша платформа предлагает индексы выражений, рассмотрите возможность добавления в него индекса. При использовании выражение не будет оцениваться для каждой строки.