Имеет ли значение порядок столбцов в предложении WHERE для выбора индекса? - PullRequest
4 голосов
/ 05 сентября 2011

Предположим, я выполняю запрос, который имеет:

WHERE column1 = "value1" 
  AND column2 = "value2"

column1 индексируется, а column2 - нет. Имеет ли значение порядок моей статьи WHERE? Должен ли я сначала запустить подзапрос над индексированным столбцом? Или SQL достаточно умен, чтобы сначала автоматически запрашивать индексированный столбец?

Ответы [ 4 ]

7 голосов
/ 05 сентября 2011

Порядок в операторе SQL не имеет значения, определенно не для индексов, которые не охватывают индексы (более одного столбца).

Для закрывающих индексов в запросе должна быть указана хотя бы одна колонка, начиная с левой части списка. IE: закрывающему индексу, определенному как «column1, column2, column3», нужны запросы, по крайней мере, для ссылки на column1 для использования индекса. Запрос, содержащий только ссылки на column2 или комбинацию column2 и column3, не будет использовать индекс покрытия.

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

Индексы также не являются ANSI, но на удивление поставщики (MySQL, Oracle и т. Д.) Имеют относительно схожий синтаксис и наименования.

1 голос
/ 28 мая 2016

Для запроса любой из этих вариантов оптимален:

INDEX(column1, column2)
INDEX(column2, column1)

Порядок вещей в WHERE не имеет значения; порядок столбцов в INDEX имеет значение , иногда много.

Кардинальность не имеет значения.

Подробнее о создании оптимальных индексов для MySQL ; большая часть этого должна относиться к другим двигателям.

1 голос
/ 05 сентября 2011

Порядок, в котором вы вводите предложение where, не имеет значения - планировщик выполнения для базы данных будет разбираться с этим.

В приведенном выше примере каждая строка, соответствующая column1, будет найдена первой, потому чтооно индексируется, а затем проверяется значение столбца 2.

0 голосов
/ 05 сентября 2011

Если я правильно помню, порядок пунктов не имеет значения.Все это часть одного и того же плана выполнения, поэтому, если вы просмотрите план exec, вы заметите, что предложение where в неиндексированном поле будет очень дорогим, независимо от порядка, в котором вы его поместили.

Если этоЕсли у вас есть много вопросов, вам лучше иметь это поле в некластеризованном индексе или, по крайней мере, с включенным в индекс предложением include.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...