Как использовать индекс в инструкции Select?


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

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

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

8 69

8 ответов:

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

SELECT *
FROM Table WITH(INDEX(Index_Name))

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

хороший вопрос

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

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

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

как использовать индекс в инструкции Select?
таким образом:

   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);

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

мне нужно явно указать?

  • нет, не нужно указывать явно.
  • DB engine должен автоматически выбирать индекс для использования на основе планов выполнения запросов, из которых он строится @Тудор Константин ответить.
  • оптимизатор будет судить, если использование индекса сделает ваш запрос работать быстрее, и если это так, он будет использовать индекс. от @niktrl ответ

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

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

SELECT Name from Table where Name = 'Boris'

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

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

SELECT * from Table where Name = 'Boris'

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

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

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

В общем случае вы должны индексировать столбцы, которые вы используете в таблице join и Where операторы

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

Index hint также, кажется, доступно для MySQL. Благодаря Тюдору Константин.

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

SELECT * FROM TABLE WHERE attribute = 'value'

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

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

тем не менее, вы можете заставьте оптимизатор сканировать с помощью чего-то вроде

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

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

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

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

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