Как использовать индекс в операторе выбора? - PullRequest
79 голосов
/ 06 июля 2011

Допустим, в таблице сотрудников я создал индекс (idx_name) для столбца emp_name таблицы.

Нужно ли явно указывать имя индекса в предложении select, или оно будет выполнено автоматическииспользуется для ускорения запросов.

Если это необходимо указать в предложении select, каков синтаксис использования индекса в запросе select?

Ответы [ 8 ]

76 голосов
/ 07 июля 2011

Если вы хотите протестировать индекс, чтобы увидеть, работает ли он, вот синтаксис:

SELECT *
FROM Table WITH(INDEX(Index_Name))

Инструкция WITH заставит индекс использовать.

32 голосов
/ 06 июля 2011

Хороший вопрос,

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

Чтобы ответить на ваш конкретный вопрос, вы должны указать используемую БД.

Для MySQL вы хотите прочитать Синтаксис индексной подсказки Документация о том, как это сделать

25 голосов
/ 18 марта 2015

Как использовать индекс в операторе выбора?
таким образом:

   SELECT * FROM table1 USE INDEX (col1_index,col2_index)
    WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM table1 IGNORE INDEX (col3_index)
WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX (i2) USE INDEX (i2);

И еще много способов проверить это

Нужно ли явно указывать?

  • Нет, нет Необходимо указывать явно.
  • Механизм БД должен автоматически выбирать индекс для использования на основе планов выполнения запросов, которые он строит из ответа @Tudor Constantin.
  • Оптимизатор определит, заставит ли ваш индекс работать ваш запрос быстрее, и если это так, он будет использовать индекс. от @niktrl ответ
13 голосов
/ 06 июля 2011

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

Если ваш запрос имеет вид:

SELECT Name from Table where Name = 'Boris'

И 1 строка из 1000 имеет имя Boris, он почти наверняка будет использован.Если всех зовут Борис, он, вероятно, прибегнет к сканированию таблицы, поскольку вряд ли индекс будет более эффективной стратегией для доступа к данным.

Если это широкая таблица (много столбцов), и вы делаете:

SELECT * from Table where Name = 'Boris'

Тогда он все равно может выбрать сканирование таблицы, если есть разумное предположение, что для извлечения других столбцов из таблицы потребуется больше времени, чем для поиска имени,или еще раз, если он все равно будет получать много строк.

9 голосов
/ 06 июля 2011

Оптимизатор определит, будет ли использование вашего индекса ускорять ваш запрос, и если это так, он будет использовать индекс.

В зависимости от вашей СУБД вы можете принудительно использовать индекс, хотя это не рекомендуется, если вы не знаете, что делаете.

Как правило, вы должны индексировать столбцы, которые вы используете в соединениях таблиц и где операторы

5 голосов
/ 06 июля 2011

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

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

Index hint, по-видимому, также доступно для MySQL .Спасибо Тудору Константину.

3 голосов
/ 06 июля 2011

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

SELECT * FROM TABLE WHERE attribute = 'value'

Будет использовать соответствующий индекс.

1 голос
/ 31 августа 2018

Подсказка индекса доступна только для серверов баз данных Microsoft Dynamics. Для традиционного SQL Server фильтры, которые вы определяете в своем предложении «Где», должны убедить механизм использовать любые соответствующие индексы ... При условии, что план выполнения механизма может эффективно определить, как читать информацию (будь то полное сканирование таблицы или индексированное сканирование) - он должен сравнивать их перед выполнением собственно оператора, как часть его встроенного оптимизатора производительности.

Однако вы можете заставить оптимизатор сканировать, используя что-то вроде

    Select  *
    From    [yourtable] With (Index(0))
    Where   ...

Или для поиска определенного индекса, используя что-то вроде

    Select  *
    From    [yourtable] With (Index(1))
    Where   ...

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

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

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