Назад в библиотеку

Индексация баз данных, как оптимизация

Источник: webadequate.ru



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

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

Механизмов таких распределений существует множество, сервер сам определяет, какой алгоритм подобрать для данных максимально эффективно. К примеру, существует таблица телефонных абонентов. Какое поле самое запрашиваемое? Наверняка телефон, но чтобы найти телефон надо знать фамилию, следовательно по полю "Фамилия" и будет вестись поиск. А значит это поле неплохо бы проиндексировать.

Если клиент запросил фамилию "Яковлев", в телефонном справочнике г.Москва, то нет никакого смысла перебирать все 8 миллионов записей, тратить огромное количество ресурсов и времени, чтобы в конце найти телефонный номер этого абонента (условно, что список в алфавитном порядке, хотя в реале это скорее всего не так). Если такое поле проиндексировать, то сервер отсортирует и разобьет весь список абонентов по неким меткам (например по буквам А ... Б ... В ... см. картинку, так что ниже), у которых есть ссылки на реальные записи. И теперь, при запросе этой же фамилии, сервер уже перейдет сразу к сегменту поименованным как "Я" и будет перебирать уже его. А это уже грубо говоря 300 000 записей, а не 8 миллионов — в 30 раз быстрее (!), условно конечно все енто. ab В свою очередь, сегмент "Я" может быть тоже разбит на указатели, (ЯВА ... ЯГА ... ЯДА ... ЯЖА ... ЯЗА и т.п.)

При создании индекса на поле(колонку), сервер реальные данные в таблице не модифицирует и не изменяет. Все эти метки, указатели (называйте как хотите) создаются в "виртуальном пространстве", завязываются непосредственно на конкретную таблицу и пользователю в явном виде не предоставляются.

Индексация баз данных, как оптимизация

Для индексации проблематичного/часто выбираемого/несущего (нужное подчеркнуть) столбца, в языке SQL предназначено ключевое слово CREATE INDEX, после него идет имя этого индекса (исключительно для служебных целей), оно может быть любым, но очень часто его обзывают так: "ix + <имя колонки>" на которую о вешается. ixName, ixPhone ... или xName, xPhone... Синтаксис всего этого дела выглядит так:

 CREATE INDEX <имя_индекса> ON <имя_таблицы> (<имя_колонки>);

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

 CREATE INDEX xName ON Phones (Name)

Создан индекс xName для колонки Name таблицы Phones.

Если в таблице слишком мало записей, то особого смысла что то индексировать там нет. Реально индексы вывозят на больших таблицах. Учтите, что на огромных таблицах (по количеству записей) создание индекса может занять какое то время и весить этот индекс может зачастую больше самой таблицы!

Удаление индекса происходит следующим образом:

 DROP INDEX <имя_индекса> ON <имя_таблицы>;
 DROP INDEX xName ON Phones;

Индекс xName из таблицы Phones был удален.