Database
 sql >> база данни >  >> RDS >> Database

Как работи индексирането

Какво прави индексирането?

Индексирането е начинът да получите неподредена таблица в поръчка, която ще увеличи максимално ефективността на заявката по време на търсене.

Когато таблицата е неиндексирана, редът на редовете вероятно няма да бъде различим от заявката като оптимизиран по какъвто и да е начин и следователно вашата заявка ще трябва да търси из редовете линейно. С други думи, заявките ще трябва да търсят във всеки ред, за да намерят редовете, отговарящи на условията. Както можете да си представите, това може да отнеме много време. Преглеждането на всеки ред не е много ефективно.

Например таблицата по-долу представлява таблица във измислен източник на данни, който е напълно неподреден.

company_id единица unit_cost
10 12 1.15
12 12 1.05
14 18 1.31
18 18 1.34
11 24 1.15
16 12 1.31
10 12 1.15
12 24 1.3
18 6 1.34
18 12 1.35
14 12 1.95
21 18 1.36
12 12 1.05
20 6 1.31
18 18 1.34
11 24 1.15
14 24 1.05

Ако трябваше да изпълним следната заявка:

SELECT
	company_id,
	units,
	unit_cost
FROM
	index_test
WHERE
	company_id = 18

Базата данни ще трябва да търси във всичките 17 реда в реда, в който се появяват в таблицата, отгоре надолу, един по един. Така че, за да потърсите всички потенциални екземпляри на company_id номер 18, базата данни трябва да прегледа цялата таблица за всички появявания на 18 в company_id колона.

Това само ще отнема все повече и повече време, тъй като размерът на масата се увеличава. С нарастването на сложността на данните това, което в крайна сметка може да се случи е, че таблица с един милиард реда се присъедини към друга таблица с един милиард реда; заявката вече трябва да търси в двойно по-голямо количество редове, което струва двойно повече време.

Можете да видите как това става проблематично в нашия вечно наситен с данни свят. Таблиците се увеличават по размер и търсенето се увеличава във времето за изпълнение.

Запитването на неиндексирана таблица, ако е представено визуално, би изглеждало така:

Това, което прави индексирането, е да настройва колоната, в която се намират условията за търсене, в сортиран ред, за да помогне за оптимизиране на ефективността на заявката.

С индекс на company_id колона, таблицата по същество би „изглеждала“ така:

company_id единица unit_cost
10 12 1.15
10 12 1.15
11 24 1.15
11 24 1.15
12 12 1.05
12 24 1.3
12 12 1.05
14 18 1.31
14 12 1.95
14 24 1.05
16 12 1.31
18 18 1.34
18 6 1.34
18 12 1.35
18 18 1.34
20 6 1.31
21 18 1.36

Сега базата данни може да търси company_id номер 18 и върнете всички искани колони за този ред, след което преминете към следващия ред. Ако comapny_id на следващия ред номерът също е 18, тогава той ще върне всички колони, поискани в заявката. Ако company_id на следващия ред е 20, заявката знае да спре търсенето и заявката ще завърши.

Как работи индексирането?

В действителност таблицата на базата данни не се пренарежда всеки път, когато условията на заявката се променят, за да се оптимизира изпълнението на заявката:това би било нереалистично. Всъщност това, което се случва, е, че индексът кара базата данни да създаде структура от данни. Типът структура на данните много вероятно е B-дърво. Докато предимствата на B-Tree са многобройни, основното предимство за нашите цели е, че е сортируемо. Когато структурата на данните е сортирана по ред, това прави търсенето ни по-ефективно поради очевидните причини, които посочихме по-горе.

Когато индексът създава структура от данни за конкретна колона, важно е да се отбележи, че в структурата на данните не се съхранява друга колона. Нашата структура от данни за таблицата по-горе ще съдържа само company_id числа. Единици и unit_cost няма да се задържат в структурата на данните.

Как базата данни знае какви други полета в таблицата да върне?

Индексите на базата данни също ще съхраняват указатели, които са просто референтна информация за местоположението на допълнителната информация в паметта. По принцип индексът съдържа company_id и домашния адрес на този конкретен ред на диска с памет. Индексът всъщност ще изглежда така:

company_id указател
10 _123
10 _129
11 _127
11 _138
12 _124
12 _130
12 _135
14 _125
14 _131
14 _133
16 _128
18 _126
18 _131
18 _132
18 _137
20 _136
21 _134

С този индекс заявката може да търси само редовете в company_id колона, която има 18 и след това с помощта на показалеца може да влезе в таблицата, за да намери конкретния ред, където живее този указател. След това заявката може да влезе в таблицата, за да извлече полетата за колоните, поискани за редовете, които отговарят на условията.

Ако търсенето беше представено визуално, то би изглеждало така:

Резюме

  • Индексирането добавя структура от данни с колони за условията за търсене и указател
  • Показателят е адресът на диска с памет на реда с останалата информация
  • Структурата на индексните данни е сортирана, за да оптимизира ефективността на заявката
  • Заявката търси конкретния ред в индекса; индексът се отнася до указателя, който ще намери останалата информация.
  • Индексът намалява броя на редовете, в които заявката трябва да търси, от 17 на 4.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Присъединете се към нас в Лас Вегас за SQLintersection и спестете $100

  2. Заключване и производителност

  3. Методи за автоматизация на Azure

  4. Риск при използване на динамична памет в Hyper-V

  5. Намаляване на фрагментацията на индекса