Как индексирование базы данных работают?

Учитывая, что индексация так важна, как набор данных увеличивается в размерах, может кто-нибудь объяснить, как работает индексация в базе данных-агностик уровне? Для получения информации о запросах проиндексировать поля, проверить, как индекс столбца базы данных.

Учитывая, что индексация так важна, как набор данных увеличивается в размерах, может кто-нибудь объяснить, как работает индексация в базе данных-агностик уровне? Для получения информации о запросах проиндексировать поля, проверить, как индекс столбца базы данных.

Зачем он нужен?
Когда данные хранятся на дисковых устройств хранения, он хранится в виде блоков данных. Эти блоки доступны в их совокупности, сделав их операцию по атомной доступ к диску. Дисковые блоки структурированы таким же образом, как связанные списки; оба содержат Раздел для данных, указатель на следующий узел (или блок), причем оба не должны быть расположены рядом.
Из-за того, что количество записей можно сортировать только по одному полю, можно констатировать, что поиск по полям, которые не отсортированы требует линейный поиск, который требует 
```
N/2
```
 заблокировать доступы (в среднем), где 
```
N
```
 количество блоков, таблица занимает. Если это поле неключевое поле (т. е. не содержит уникальные записи), то все пространство должно быть найдены на 
```
N
```
 заблокировать доступы.
А с сортировкой поле, бинарный поиск может быть использован, который 
```
log2 N
```
 заблокировать доступы. Кроме того, поскольку данные сортируются с учетом неключевое поле, остальные таблицы не нужно искать повторяющиеся значения, еще большее значение не найдено. Таким образом, прирост производительности существенный.
Что такое индексирование?
Индексация-это способ сортировки количество записей по нескольким полям. Создание индекса на поле в таблице создается еще одна структура данных, которая содержит значение поля, и указатель на запись к нему относится. Эта структура индекса сортируются, позволяя бинарный поиск выполняется на нем.
Недостатком индексирования заключается в том, что эти показатели требуют дополнительного пространства на диске с индексами хранятся в таблице, используя движок MyISAM двигатель, этот файл можно быстро добраться до ограничений размера файла, лежащего в основе системы, если много полей в одной таблице индексируются.
Как это работает?
Во-первых, давайте очертим образец таблицы схемы базы данных;
Имя поля тип размер данных на диске
идентификатор (первичный ключ) без знака int 4 байта
имя типа char(50) 50 байт
фамилия Голец(50) 50 байт
Голец значение emailaddress(100) 100 байт
Примечание: символ был использован вместо varchar, чтобы позволить точный размер на диске.
Эта база данных содержит пять млн. строк и неиндексированные. Выполнение нескольких запросов будут проанализированы. Эти запроса, используя идентификатор (сортированный ключевое поле) и с помощью " имя " (неключевое поле несортированный).
Пример 1 - отсортированный поля против несортированный
Учитывая наш пример базы данных 
```
r = 5,000,000
```
 записей фиксированного размера учитывают длину 
```
R = 204
```
 байтах, и они хранятся в таблице, используя движок MyISAM двигатель, который использует размер блока по умолчанию 
```
B = 1,024
```
 байт. Блокирующий фактор в таблице будет 
```
bfr = (B/R) = 1024/204 = 5
```
 записи блока диска. Общее количество блоков, необходимое для удержания таблица 
```
N = (r/bfr) = 5000000/5 = 1,000,000
```
 блоков.
Линейный поиск по ID поля потребуется в среднем 
```
N/2 = 500,000
```
 заблокировать доступы к найти значение, учитывая, что поле ID-это ключевое поле. Но поскольку в поле " id " сортировка, двоичный поиск может быть проведен, требующие в среднем 
```
log2 1000000 = 19.93 = 20
```
 заблокировать доступы. Мгновенно мы видим это резкое улучшение.
Теперь " имя " поле не отсортированный или ключевое поле, поэтому бинарный поиск-это невозможно, ни ценности уникальны, и поэтому таблица потребует поиск до конца точной 
```
N = 1,000,000
```
 заблокировать доступы. Это такая ситуация, что индексация направлена на правильное.
Учитывая, что запись индекса содержит только индексированные поля и указатель на исходную запись, естественно, будет меньше, чем в мульти-поле записи, на который она указывает. Таким образом, сам индекс требуется меньшее количество дисковых блоков, чем исходная таблица, которая, следовательно, требует меньше заблокировать доступы для перебора. Схемы для индекса на поле firstName, описанные ниже;
Имя поля тип размер данных на диске
имя типа char(50) 50 байт
(запись указателя) специальные 4 байта
Примечание: указатели в MySQL, 2, 3, 4 или 5 байт в зависимости от размера таблицы.
Пример 2 - индексация
Учитывая наш пример базы данных 
```
r = 5,000,000
```
 записи, длина записи, указатель 
```
R = 54
```
 байт и используя размер блока по умолчанию 
```
B = 1,024
```
 байт. Блокирующий фактор индекса будет 
```
bfr = (B/R) = 1024/54 = 18
```
 записи блока диска. Общее число блоков, требуемое для хранения индекса является 
```
N = (r/bfr) = 5000000/18 = 277,778
```
 блоков.
Теперь поиск с помощью поля " имя " может использовать индекс для повышения производительности. Это позволяет бинарный поиск индекса в среднем 
```
log2 277778 = 18.08 = 19
```
 заблокировать доступы. Найти адрес фактический запись, которая требует дальнейшего блокировать доступ для чтения, доведя их общее количество до 
```
19   1 = 20
```
 заблокировать доступы, далеко от 1,000,000 заблокировать доступы требуется найти соответствие " имя " в неиндексированные таблицы.
Когда его следует использовать?
Учитывая, что создание индекса требует дополнительного дискового пространства (дополнительные 277,778 блоки из приведенного выше примера, в ~28% увеличение), и что слишком много индексов может привести к проблемам, вытекающих из файловой системы по размеру, тщательного анализа должны быть использованы для выбора правильного поля для индекса.
Поскольку показатели используются только, чтобы ускорить поиск соответствующего поля в записи, само собой разумеется, что индексация полей используется только для вывода будет просто пустая трата дискового пространства и времени обработки при выполнении инструкции INSERT или Delete, и поэтому следует избегать. Также учитывая характер двоичный поиск, кардинальность или уникальности данных. Индексации на поле с количеством элементов 2 будет разделения данных в два раза, а мощность в 1000 будет около 1000 записей. С такой низкой мощности эффективности сводится к линейной сортировки, и оптимизатор запросов не будет использовать индекс, если число элементов составляет менее 30% от рекордного количества, эффективно делая индекса пустое место.

Первый раз я прочитал это было очень полезно для меня. Спасибо.
С тех пор я получил представление о недостатке создания индексов:
если вы пишете в таблицу (
```
UPDATE
```
 или 
```
INSERT
```
) с одним индексом, то есть фактически две операции записи файловой системы. Для табличных данных, а другой для данных индекса (и обращения его (и - если кластерный - на пересортировку данных таблицы)). Если таблицы и индексы находятся на том же жестком диске, это стоит больше времени. Таким образом, таблица без индекса (куча) , позволит ускорить операции записи. (если у вас два индекса вы бы в конечном итоге с трех операций записи, и так далее)
Однако, определение двух разных местах на двух разных жестких дисках для данных индексов и данных таблицы можно уменьшить/устранить проблему удорожания время. Это требует определения дополнительных групп файлов с по файлы на нужные диски и определение таблицы/положение индекса по желанию.
Другая проблема с индексов является их фрагментация с течением времени, как будут вставляться данные. 
```
REORGANIZE
```
 помогает, необходимо написать процедуры, чтобы это было сделано.
В некоторых случаях кучи более полезным, чем таблица с индексами,
е.г:- Если у вас много конкурируя пишет, но только один ежевечерне читать в нерабочее время для отчетности.
Кроме того, различие между кластеризованными и некластеризованными индексами весьма важно.
Помог мне:- что делать кластерным и не кластеризованный индекс на самом деле означает?

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

Классический пример индекса "в книгах" Рассмотреть книгу "" из 1000 страниц, деленное на 100 секций, каждая секция с х страницах. Простой, да? Теперь, без индексной страницы, чтобы найти конкретный раздел, который начинается с буквы "S", у вас нет другого выбора, чем сканирование через всю книгу. я.э: 1000 страниц Но с индексной страницы в начале, вы там. И еще, читать какому-то конкретному разделу, что важно, вам просто необходимо заглянуть за страницы индекса, снова и снова, каждый раз. После нахождения индекса соответствия можно эффективно перейти к разделу пропуская другие разделы. Но потом, в дополнение к 1000 страниц, вам понадобится еще ~10 страниц, чтобы отобразить страницу индекса, итого 1010 страниц. Таким образом, индекс-это отдельный раздел, который хранит значения в индексированный столбец указатель на проиндексированных строк в отсортированном порядке для эффективного взглядом окна. Вещи просты в школах, не так ли? :Р

Теперь, допустим, что мы хотим выполнить запрос, чтобы найти все сведения о любых сотрудников, которые названы ‘Азбука’?

```
SELECT * FROM Employee 
WHERE Employee_Name = 'Abc'

```

Что будет без индекса?
Программное обеспечение базы данных в буквальном смысле придется просматривать каждую строку в таблице employee, чтобы увидеть, если Имя\_сотрудника для этой строки является ‘Азбука’. И, ведь мы хотим, чтобы в каждой строке с названием ‘Азбука’ внутри него, мы не можем просто перестать смотреть, когда мы найдем только одну строку с именем ‘Азбука’, потому что там могут быть и другие строки с именем ABC. Так, каждой строке, до последней строки должны быть найдены – что означает тысячи строк в этом случае придется пройти обследование в базе данных, чтобы найти строки с именем ‘Азбука’. Это то, что называется сканирование всей таблицы
Как индекс базы данных может повысить производительность
Смысл иметь индекс, чтобы ускорить поисковым запросам существенно сократить количество записей/строк в таблице, которые должны быть рассмотрены. Индекс-это структура данных (чаще всего в виде B - дерева), которое хранит значения определенного столбца в таблице.
Как B-дерева индекса работы?
Причина Б - деревья являются самыми популярными структуры данных для индексов объясняется тем, что они являются эффективными, потому что вид окон, удалений и вставок все это можно сделать за логарифмическое время. И, еще одна важная причина, B - деревья используются чаще, потому что данные, которые хранятся в B - дерево может быть отсортирован. РСУБД обычно определяет, какая структура данных используется для индекса. Но, в некоторых случаях с определенной СУБД, вы действительно можете указать, какие структуры данных вы хотите, чтобы ваши базы данных, чтобы использовать при создании самого индекса.
Как хэш-таблицы индексов работу?
Причина используется хеш индексирует, потому что хэш-таблицы являются чрезвычайно эффективными, когда речь идет просто поиск значений. Так, запросы, которые сравнивают на равенство строки можно получить очень быстро значения, если они используют хэш-индекс.
Например, по запросу мы обсуждали ранее могли воспользоваться хэш-индекс, созданный на колонке Имя\_сотрудника. Кстати, хэш-индекс будет работать состоит в том, что значение столбца будет ключ в хэш-таблицу и фактическое значение отображается на этот ключ будет просто указатель на данные строки в таблице. Так как хэш-таблица-это в основном ассоциативный массив, типичная запись будет выглядеть что-то вроде "Азбуки => 0x28939", где 0x28939 ссылка на строку таблицы, где ABC хранится в памяти. Искать значение, как “ABC” в индекс хэш-таблицы, и возвращается ссылка на строку в памяти, очевидно, гораздо быстрее, чем сканирование таблицы, чтобы найти все строки со значением “ABC” в столбце Имя\_сотрудника.
Недостатки хэш-индекс
Хэш-таблицы не сортируются структур данных, и существует много типов запросов, для которых хэш-индексы даже не можете помочь. Например, предположим, что вы хотите найти всех сотрудников, которые находятся менее чем в 40 лет. Как вы могли так поступить с индекса хэш-таблицы? Ну, это не возможно, потому что хэш-таблица годится только для поиска пары ключ-значение – это означает, запросы, проверки на равенство
Что именно находится внутри индекса базы данных?
Итак, теперь вы знаете, что индекс база данных создается на столбец в таблице, и что индекс сохраняет значения в определенном столбце. Но, важно понимать, что индекс базы данных не хранит значений в других столбцах той же таблицы. Например, если создать индекс на столбце Имя\_сотрудника, это означает, что Employee\_Age и значения столбцов Employee\_Address также не сохраняются в индексе. Если бы мы сделали просто хранить все остальные столбцы в индексе, то это был бы создавая еще одну копию на всю таблицу – что заняло бы слишком много места и будет очень неэффективно.
Как базу знать, когда использовать индекс?
Для запроса “выберите * от сотрудника Имя\_сотрудника = ‘АБВ’ ” запущен, база данных будет проверять, если есть индекс по столбцу(ы) запрашивается. Если Имя\_сотрудника столбец имеет индекс, созданный на его базе придется решать, стоит ли это вообще смысл использовать индекс, чтобы найти значения ищется – потому что в некоторых случаях это на самом деле менее эффективно использовать базу данных индексов, и более эффективным просто сканировать всю таблицу.
Какова стоимость наличие индекса базы данных?
Он занимает пространство – и чем больше таблица, тем больше индекс. Еще один удар по производительности с помощью индексов является тот факт, что всякий раз, когда вы добавить, удалить или обновить строки в соответствующей таблице, те же операции придется проделать на свой индекс. Помните, что индекс должен содержать ту же самую актуальную информацию, как в этой таблице в столбце(с), что индекс охватывает.
Как правило, индекс должен быть создан только на таблицу, если данные в индексированных столбцов будут часто запрашиваться.
См. также
Какие колонки, как правило, делают хорошие коэффициенты?
Как сделать индексы базы данных работа

Простое Описание!!!!!!!!!!
Индекс это ничто иное, как структура данных, которая хранит значения определенного столбца в таблице. Создается индекс на столбце таблицы.
Например, у нас есть таблица базы данных, называют пользователей с тремя столбцами – имя, возраст и адрес. Предположим, что таблица имеет несколько тысяч строк.
Теперь, допустим, что мы хотим выполнить запрос, чтобы найти все данные о любом пользователи, которые названы "Джон".
Если выполнить следующий запрос.

```
SELECT * FROM User 
WHERE Name = 'John'

```

Программное обеспечение базы данных в буквальном смысле придется просматривать каждую строку в таблице пользователей, чтобы увидеть, если имя для этой строки является ‘Джон’. Это займет много времени.
Это где показатель индекса помогает нам "используется для ускорения поисковым запросам существенно сократить количество записей/строк в таблице, которая должна быть изучена".
Как создать индекс

```
CREATE INDEX name_index
ON User (Name)

```

Индекс состоит из значений столбца(например: Иван) из одной таблицы, и что эти значения хранятся в структуре данных.
Так что теперь база данных будет использовать индекс, чтобы найти человек по имени Джон, потому что индекс, вероятно, отсортированный в алфавитном порядке по имени пользователя. И, так как он отсортирован, это означает поиск имени-это намного быстрее, потому что все имена, начинающиеся с буквы “J” будут рядом друг с другом в индексе!

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

Просто думаю, что из индекса базы данных, как индекс книги. Если у вас есть книга о собаках и вы хотите найти информацию о том, скажем, немецкая овчарка, можно, конечно, пролистывать все страницы книги и найти то, что вы ищете, но это, конечно, трудоемкий и не очень быстрый. Другой вариант состоит в том, можно просто ехать по указателю раздел книги, а затем найти то, что вы ищете, используя имя предприятия которую вы ищите ( в данном случае, немецких овчарок), а также посмотрев на номер страницы, чтобы быстро найти то, что вы ищете. В базе, номер страницы называется указатель, который направляет на базу по адресу на диске, где находится существо. Используя ту же аналогию немецкая овчарка, мы могли бы что-то вроде этого (“немецкая овчарка”, 0x77129), где 0x77129 адрес на диске, где данные строки для немецкой овчарки хранится. Короче говоря, индекс-это структура данных, которая хранит значения определенного столбца в таблице, так как для ускорения поиска.