RDBS, когда использовать сложные индексы для запросов, а когда использовать простые? - PullRequest
1 голос
/ 18 мая 2009

Предположим, в моей схеме БД есть таблица с именем TEST с полями (id, имя, адрес, телефон, комментарии). Теперь я знаю, что собираюсь выполнить большой набор различных запросов для этой таблицы, поэтому мой вопрос следующий, когда и почему я буду создавать индексы, такие как ID_NAME_INDX (индекс для идентификатора и имени), и когда будет более эффективно создавать отдельно индекс для идентификатора и индекс для поля имени (когда я имею в виду для какого типа запроса)?

Ответы [ 3 ]

1 голос
/ 18 мая 2009

Я не уверен, что ваш пример объясняет конкретный вопрос, который вы задаете. Вы говорите, если у вас должен быть индекс по ID и индекс по имени, в отличие от индекса по идентификатору и имени. Дело в том, что я предполагаю, что ID - это ваш первичный ключ, и поэтому вы вряд ли выполните поиск по ID и имени.

Однако, с точки зрения таблицы с двумя идентификаторами, поиск по которой вы хотите выполнить либо по одному, либо по обоим вместе, то при наличии трех индексов, по одному на каждый из идентификаторов и один в сочетании, будет самым быстрым. Если у вас есть два индекса, то для поиска искомой записи необходимо выполнить поиск по обоим индексам. Однако, если у вас есть один индекс, охватывающий оба идентификатора, тогда нужно искать только этот индекс.

Как и во всех индексах, по мере их добавления размер вашей базы данных увеличивается, и вы получаете снижение производительности вставки / обновления. Вам всегда нужно взвесить прибыль / убыток.

Добавьте индексы к абсолютно очевидным кандидатам, добавьте индексы к «возможно» по мере необходимости. Продолжайте следить за производительностью вашей базы данных и запускать анализаторы запросов, чтобы увидеть, где со временем может быть достигнут любой выигрыш в производительности.

1 голос
/ 18 мая 2009

Общая цель состоит в том, чтобы "охватить" все столбцы, чтобы в запросе использовался только индекс.

-- An index on Name including ID would be ideal
SELECT
    [id]
FROM
    TEST
WHERE
    [name] = 'bob'

Скажем, вам нужно имя и индекс, но есть отдельные индексы. Вы получите поиск по закладкам из индекса на ПК, чтобы получить другие столбцы (при условии, что он не просто сканирует ПК)

Редактировать, после 1-го комментария:

select * from test where id='id1' and name='Name1'

Для этого запроса, SELECT *, но смягчает против любого индекса, поэтому будет использоваться PK. Если у вас было:

select address from test where id='id1' and name='Name1'

тогда индекс «ID», имя, включая адрес, «охватит» его.

Использование «ИЛИ» создает трудности для любой стратегии. Однако

select address from test where id='id1' and name='Name1'

по-прежнему будет использовать "ID, имя, включая адрес", скорее всего, но сканировать его, а не искать

Читать это: Основы плана выполнения

0 голосов
/ 18 мая 2009

Большинство программ для работы с базами данных содержат какой-то инструмент для отладки ваших запросов. Обычно они могут сказать вам, какие индексы рассматривал сервер и какие он в итоге использовал. Эта функция обычно называется объяснением или чем-то похожим.

Обычно вы должны создавать индексы для столбцов, которые используются в предложении where или соединениях.

...