Что такое индекс в SQL?

441

Что такое индекс в SQL? Можете ли вы объяснить или ссылку, чтобы понять ясно?

Где я должен использовать индекс?

Сурья Сасидхар
источник

Ответы:

378

Индекс используется для ускорения поиска в базе данных. В MySQL есть хорошая документация по этому вопросу (которая актуальна и для других серверов SQL): http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html.

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

Индекс также может быть UNIQUEиндексом, что означает, что в этом столбце не может быть повторяющихся значений, или значение, PRIMARY KEYкоторое в некоторых механизмах хранения определяет, где в файле базы данных хранится значение.

В MySQL вы можете использовать EXPLAINперед вашим SELECTоператором, чтобы увидеть, будет ли ваш запрос использовать какой-либо индекс. Это хорошее начало для устранения проблем с производительностью. Подробнее читайте здесь: http://dev.mysql.com/doc/refman/5.0/en/explain.html

Эмиль Викстрем
источник
«Индекс также может быть УНИКАЛЬНЫМ индексом ...» Просто чтобы подтвердить, означает ли это, что индекс может быть не УНИКАЛЬНЫМ? Я всегда думал, что это УНИКАЛЬНО. Извините, я новичок в SQL
Даниэль Курниади
@DanielKurniadi Большинство индексов не являются уникальными. У меня может быть база данных пользователей, и я хочу запрашивать всех, кто живет в Гетеборге. Индекс в поле «город» ускорит мой запрос. Но в Гетеборге живет более 1 пользователя, поэтому индекс должен быть не уникальным.
Эмиль Викстрем
175

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

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

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

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

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

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

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

Дейв Хилдич
источник
151

Очень хорошая аналогия - считать индекс базы данных индексом в книге. Если у вас есть книга о странах и вы ищете Индию, то зачем вам перелистывать всю книгу - что эквивалентно полному сканированию таблицы в терминологии базы данных - когда вы можете просто перейти к индексу в конце Книга, которая расскажет вам точные страницы, где вы можете найти информацию об Индии. Аналогично, так как индекс книги содержит номер страницы, индекс базы данных содержит указатель на строку, содержащую значение, которое вы ищете в своем SQL.

Больше здесь

Арун Кумар М
источник
2
Я восхищаюсь опытными парнями, объясняющими вещи с помощью «аналогий». +1
ОСШ
83

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

В SQL Server кластерный индекс определяет физический порядок данных в таблице. В таблице может быть только один кластерный индекс (кластерный индекс - это таблица). Все остальные индексы в таблице называются некластеризованными.

Митч Пшеничный
источник
49

Индексы предназначены для быстрого поиска данных .

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

Аналогичным образом индексы в базе данных могут помочь запросам быстро находить данные. Если вы новичок в индексах, следующие видео могут быть очень полезны. На самом деле, я многому научился у них.

Основы индекса
Кластерные и некластерные индексы
Уникальные и неуникальные индексы
Преимущества и недостатки индексов

Суреш
источник
Чтение всех ответов заставило меня задуматься, почему бы не индексировать все. +1 за включение ссылки, содержащей недостатки.
Лакшай Гарг
@LakshayGarg Иногда ненужная индексация также может замедлить время выполнения запроса, поэтому мы не должны пытаться индексировать все. Так же, как у всего есть свои плюсы и минусы.
Гаурав Райдео
@LakshayGarg Гаурав Райдео прав. Придерживайтесь той же аналогии: вы можете индексировать каждую главу, рисунок или таблицу в книге, но не каждый абзац, предложение или слово. Обычно это было бы излишним и привело бы к ненужным осложнениям. Надеюсь, что это достаточно близко к нарисованной картине в этом ответе.
Колидир
23

Ну вообще индекс это B-tree . Существует два типа индексов: кластеризованные и некластеризованные.

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

Некластеризованный индекс также является двоичным деревом, но он не создает физический порядок строк. Таким образом, листовые узлы некластерного индекса содержат PK (если он существует) или индекс строки.

Индексы используются для увеличения скорости поиска. Потому что сложность O (log N). Индексы это очень большая и интересная тема. Я могу сказать, что создание индексов для большой базы данных иногда является искусством.

голос
источник
6
в общем, это b-дерево, а не бинарное дерево.
Митч Уит
поэтому, поскольку в индексах используются самобалансирующиеся деревья, каждый раз, когда вы добавляете / удаляете строку, она уравновешивает себя - что делает вставку / удаление дороже ... правильно?
Дэвид Рафаэли
20

INDEXES - легко найти данные

UNIQUE INDEX - повторяющиеся значения не допускаются

Синтаксис для INDEX

CREATE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);

Синтаксис для UNIQUE INDEX

CREATE UNIQUE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);
рагу
источник
13

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

Без индексации Итак, предположим, что запрос должен найти 50, он должен будет прочитать 49 записей в виде линейного поиска.

Смотрите следующее изображение. (Это изображение было взято из этого видео )

введите описание изображения здесь

Когда мы применяем индексирование, запрос быстро обнаруживает данные, не считывая каждый из них, просто удаляя половину данных в каждом обходе, как при бинарном поиске. Индексы mysql хранятся в виде B-дерева, где все данные находятся в конечном узле.

Kraví
источник
12

INDEX - это метод оптимизации производительности, который ускоряет процесс поиска данных. Это постоянная структура данных, которая связана с таблицей (или представлением), чтобы повысить производительность при извлечении данных из этой таблицы (или представления).

Индексный поиск применяется более конкретно, когда ваши запросы включают фильтр WHERE. В противном случае, т. Е. Запрос без WHERE-фильтра отбирает целые данные и обрабатывает их. Поиск по всей таблице без INDEX называется Table-scan.

Вы найдете точную информацию для Sql-индексов в ясной и надежной форме: перейдите по следующим ссылкам:

  1. Для лучшего понимания: http://dotnetauthorities.blogspot.in/2013/12/Microsoft-SQL-Server-Training-Online-Learning-Classes-INDEX-Overview-and-Optimizations.html
  2. Для понимания в плане реализации: http://dotnetauthorities.blogspot.in/2013/12/Microsoft-SQL-Server-Training-Online-Learning-Classes-INDEX-Creation-Deletetion-Optimizations.html
nayeemDotNetAuthorities
источник
6

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

Senseful
источник
6

Если вы используете SQL Server, одним из лучших ресурсов является его собственная электронная книга, которая поставляется вместе с установкой! Это первое место, на которое я бы сослался для ЛЮБЫХ тем, связанных с SQL Server.

Если это практично, "как мне это сделать?" вопросы, тогда лучше задать StackOverflow.

Кроме того, я давно не вернулся, но sqlservercentral.com был одним из лучших сайтов, связанных с SQL Server.

cloneofsnake
источник
0

Индекс является on-disk structure associated with a table or view that speeds retrieval of rows from the table or view. Индекс содержит ключи, построенные из одного или нескольких столбцов в таблице или представлении. Эти ключи хранятся в структуре (B-дерево), которая позволяет SQL Server быстро и эффективно находить строки или строки, связанные со значениями ключей.

Indexes are automatically created when PRIMARY KEY and UNIQUE constraints are defined on table columns. For example, when you create a table with a UNIQUE constraint, Database Engine automatically creates a nonclustered index.

Если вы сконфигурируете PRIMARY KEY, компонент Database Engine автоматически создает кластеризованный индекс, если только кластерный индекс не существует. Когда вы пытаетесь применить ограничение PRIMARY KEY для существующей таблицы, и кластеризованный индекс уже существует в этой таблице, SQL Server принудительно применяет первичный ключ, используя некластеризованный индекс.

Пожалуйста, обратитесь к этому для получения дополнительной информации об индексах (кластеризованных и некластеризованных): https://docs.microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described?view= SQL-сервер ver15

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

adSad
источник