Как использовать индексы в SQL - PullRequest
0 голосов
/ 20 сентября 2009

Я создаю довольно большую базу данных, в которой около 6,9 миллионов записей.

Простой выбор занимает 6-7 секунд, поэтому я сейчас работаю над оптимизацией и изучением других вариантов.

Очевидным является создание индекса или двух.

Пример:

CREATE INDEX "INDEX_NAME" ON "TABLE_NAME" (COLUMN_NAME)

Это сработало.

Однако я не могу получить действительный синтаксис sql для использования индекса в операторе выбора. Предполагается, что вы можете использовать «select index_name from table_name», по крайней мере, я так и сделал :). Однако он кажется недействительным, и я не могу на всю жизнь найти пример в сети, что также подразумевает, что я пришел из неправильный угол, или никто не задокументировал это ...

Буду признателен за любую помощь в использовании индексов!

Ответы [ 6 ]

4 голосов
/ 20 сентября 2009

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

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

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

Есть искусство настроить правильные индексы. Вот недавний пример, который показывает, какие алгоритмы и комбинации индексов являются лучшими для определенных видов выборок в базе данных MySQL: http://www.mysqlperformanceblog.com/2009/09/19/multi-column-indexes-vs-index-merge/ Это, вероятно, слишком сложно, чтобы быть полезным для вас прямо сейчас, но прочтите его чтобы понять, что оптимизатор пытается для вас выяснить.

2 голосов
/ 20 сентября 2009

Если вы используете MySQL, вы можете указать, какой индекс использовать или нет.

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;

Вы можете найти больше информации здесь: http://dev.mysql.com/doc/refman/5.1/en/index-hints.html

Уоррен Брайан Норонха

2 голосов
/ 20 сентября 2009

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

Также вы можете создать что-то, что называется индексом покрытия. Это индекс, в котором будут все поля для запроса. Это позволяет SQL Server запрашивать только индекс, а не таблицу, которую он индексирует.

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

Надеюсь, что поможет

1 голос
/ 20 сентября 2009

Не думаю, что вы понимаете, как работают индексы. Выбор выполняется в индексированном столбце так же, как выполняется выбор в индексированном столбце.

0 голосов
/ 20 сентября 2009

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

Посмотрите на план запроса - пример для Sybase и sql-server os установить showplan на выберите .....

Это покажет, используется ли индекс

В некоторых случаях вам нужно форсировать индексы, но это редко

0 голосов
/ 20 сентября 2009

Я думаю, это может зависеть от того, какой тип базы данных вы используете, но для моего опыта работы с SQL Server (2000, 2005, 2008) просто не нужно беспокоиться об имени индекса. Вы просто создаете его в столбцах, которые вы часто можете использовать в качестве фильтров в своих запросах (предложение WHERE или объединения), а затем выполняете свои запросы в обычном режиме. Сервер базы данных позаботится об использовании индекса всякий раз, когда считает, что он может помочь.

Надеюсь, это поможет

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