Вам необходимо создать индексы для столбцов, которые появляются в ваших предложениях WHERE
. Из этого правила есть несколько исключений:
- Если столбец имеет только одно или два уникальных значения (каноническим примером этого является «пол» - с возможными значениями только «Мужской» и «Женский», здесь нет никакого индекса для индекса). Как правило, вам нужен индекс, который сможет ограничивать строки, которые должны быть обработаны значительным числом (например, индекс, который только уменьшает пространство поиска на 50%, не стоит того, но индекс, который уменьшает его на 99 % - это ).
- Если вы ищете
x LIKE '%something'
, то индекс не имеет смысла. Если вы считаете индекс указанием определенного порядка для строк, то сортировка по x
, если вы ищете "% что-то", бесполезна: вам все равно придется сканировать все строки .
Итак, давайте посмотрим на случай, когда вы ищете "ключевое слово" бухгалтерский учет ". В соответствии с вашей страницей результатов, генерируется SQL:
SELECT
*
FROM (
SELECT TOP 10
ROW_NUMBER() OVER (ORDER BY sq.name) AS Row,
sq.*
FROM (
SELECT
c.*,
p.providername,
p.school,
p.website,
p.type
FROM
cpd_COURSES c, cpd_PROVIDERS p
WHERE
c.providerid = p.providerid AND
c.activatedYN = 'Y' AND
(
c.name like '%accounting%' OR
c.title like '%accounting%' OR
c.keywords like '%accounting%'
)
) sq
) AS temp
WHERE
Row >= 1 AND Row <= 10
В этом случае я буду считать, что cpd_COURSES.providerid
является внешним ключом для cpd_PROVIDERS.providerid
, и в этом случае вам не нужен индекс, потому что он уже будет иметь его.
Кроме того, столбец activatedYN
является столбцом T / F и (согласно моему правилу выше об ограничении возможных значений только на 50%) столбец T / F также не должен индексироваться.
Наконец, поскольку при поиске по запросу x LIKE '%accounting%'
вам не нужен индекс по имени, названию или ключевым словам - потому что он никогда не будет использоваться.
Итак, главное, что вам нужно сделать в этом случае, это убедиться, что cpd_COURSES.providerid
на самом деле является внешним ключом для cpd_PROVIDERS.providerid
.
SQL Server Specific
Поскольку вы используете SQL Server, в Management Studio есть ряд инструментов, которые помогут вам решить, куда вам нужно поместить индексы. Если вы используете «Index Tuning Wizard», он обычно довольно хорошо говорит вам, что даст вам хорошие улучшения производительности. Вы просто вставляете в него свой запрос, и он вернется с рекомендациями по добавлению индексов.
Вам все равно нужно быть немного осторожнее с добавляемыми вами индексами, потому что чем больше у вас индексов, тем медленнее будут INSERT
s и UPDATE
s. Поэтому иногда вам необходимо объединять индексы или просто игнорировать их, если они не дают достаточного выигрыша в производительности. Некоторое суждение требуется.