Если вас интересует конкретная тема в книге, вы переходите в конец книги и находите ее в алфавитном порядке в указателе. Индекс говорит вам номер страницы, где обсуждается тема. Затем вы переходите прямо к интересующим вас страницам. Гораздо быстрее, чем чтение всей книги.
То же самое в базе данных. Индекс означает, что вы можете переходить к объединяющимся строкам, а не сканировать каждую строку в таблице в поисках совпадения.
Посмотрите, как работает кластерный индекс (http://msdn.microsoft.com/en-us/library/ms177443.aspx).. Вы можете иметь один из них для каждой таблицы.
В этой статье объясняется, как работает некластеризованный индекс (http://msdn.microsoft.com/en-us/library/ms177484.aspx).. Их может быть столько, сколько вы хотите.
Обе эти статьи посвящены Microsoft Sql Server, но теория индексов одинакова во всех системах управления реляционными базами данных.
С индексами связаны затраты. Каждый раз, когда вставка / обновление выполняется в таблице, возможно, обновленный индекс (ы) также должен быть обновлен. И, конечно, индексы занимают место - но это не является проблемой для большинства из нас. Таким образом, вам необходимо сбалансировать преимущества производительности от более быстрых объединений или фильтрации с затратами на вставки и обновления.
В качестве руководства обычно требуется индекс, соответствующий каждому из столбцов, включенных в объединение или условие where:
SELECT
*
FROM
Customer
WHERE
RegistrationDate > @registrationDate
AND RegistrationCountry = @registrationCountry;
Таким образом, индекс в таблице Customer, включающей столбцы RegistrationDate и RegistrationCountry, ускорит этот запрос. Поскольку мы используем «>» в нашем запросе, это было бы хорошим кандидатом для кластеризованного индекса (первая статья показывает, что кластеризованный индекс физически упорядочивает данные в порядке индекса, поэтому запросы диапазона могут очень быстро изолировать диапазон индекса ).
SELECT
*
FROM
Customer c
INNER JOIN Order o
ON o.CustomerID = c.CustomerID
AND o.OrderType = @orderType
Здесь нам нужен индекс для таблицы Customer, содержащей столбец CustomerID. И нам нужен индекс для таблицы Order, содержащей столбцы CustomerID и OrderType. Тогда обеим сторонам объединения не нужно будет выполнять сканирование таблицы.
Как правило, существует лишь небольшое количество способов запроса данных из таблицы, поэтому вы не получите перегрузку индекса. Множество индексов иногда является признаком того, что ваши таблицы имеют смешанные проблемы и могут быть нормализованы