Часто разработчики не до конца понимают применение индексов для столбцов -
внешних ключей.
Часть программистов уверена, что индекс необходим при любых раскладках. Часть
- наоборот - считают, что они только снижают производительность за счёт необходимости
обслуживания ненужного индекса :).
На самом деле - правильное решение зависит от реального приложения.
Рассмотрим типичные тестовые таблички:
Товар Т Вид товара V
----------- --------------
id PK :-> id_tov int PK
id_tov int FK --: name
kolvo
В таблице товаров Т поле id_tov является внешним ключом. Его
можно проиндексировать, а можно и не индексировать.
При отсутствии индекса, ограничение целостности данных работать будет в любом
случае. Это не зависит от него !!!
Но !
- При изменении любого поля таблицы товаров, будет блокироваться на изменения
(в частности и на Insert ) справочная таблица. Поскольку справочная таблица
обычно редко изменяется, то это можно и проигнорировать...
- При изменении первичного ключа или удалении любой строки в справочнике,
даже не задействованной в таблице товаров, блокироваться будет вся таблица
товаров ! А это уже неприятно...
Выводы:
- Индекс можно не заводить, если справочная таблица изменяется
редко, и её можно менять не в момент максимальной активности пользователей.
Транзакции обновления справочных таблиц должны быть в этом случае короткими.
- Индекс нужно заводить, если главная таблица (справочник)
меняется очень часто - например перечень товаров в большом торговом центре,
и, в случае, если используется в запросах условия, основанные на этом поле.
Например, в нашем случае - выдать все товары определённого вида:
SELECT t.* FROM t,v WHERE t.id_tov=v.id_tov AND v.name='сыр'