7.1 Причини за появата на индекси

Друго важно нещо, без което не може да има бази данни, са индексите.

Представете си ситуация, в която има 10 мorона потребители в потребителската table и искате да покажете всички, които имат ниво над 90. Тази заявка е много проста за писане:

SELECT * FROM user WHERE level > 90

Страхотно, написахме заявката за по-малко от minutesа. И колко време ще отнеме изпълнението на тази заявка от SQL сървъра? За да изпълни такава заявка, той ще трябва да премине през 10 мorона записа и дори да има само един запис, това ще отнеме много време.

Как бихме изпълнor подобна задача в Java? Първо бихме сортирали колекцията от потребители по ниво и след това бихме могли много бързо да намерим необходимите записи с помощта на двоично търсене. Надявам се, че няма нужда да обяснявам Howво е?

Страхотно, но Howво ще стане, ако сега трябва да изберем потребители, чиято дата на регистрация е била преди 2020 г.? Сортирайте отново по дата на регистрация и използвайте двоично търсене.

Да, ако извършим филтър върху някое поле, и то не само веднъж, а често, тогава ще бъде много полезно да съхраняваме данните, сортирани по това поле.

И How да съхранявате данни, сортирани едновременно по различни полета?

И отговорът е много прост - трябва да съхранявате не самите данни, а техните индекси в няHowва глобална table.

Да кажем, че има 10 потребители с id: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}.

И вие решите да ги сортирате по ниво, тогава масивът от техните идентификатори ще бъде например така: {9, 2, 3, 1, 5, 4, 8, 6, 7, 10}.

И ако ги сортираме по дата, тогава получаваме например: {10, 1, 8, 7, 2, 3, 5, 9, 6}.

Масивите от тези идентификатори се наричат ​​индекси . Самите елементи са големи, не ги пипаме. В Java не докосваме обекти, а съхраняваме техните препратки; в SQL не докосваме реални низове, а съхраняваме техните номера.

Нека пренапиша това в Java code:

List<String> list = List.of("A", "C", "B", "Z", "Cc", "Bb", "Zz", "Y");  //this is a list of objects
List<String> alphabeticsList = new ArrayList(list);
Collections.sort(alphabeticsList); //collection sorted alphabetically

List<String> lengthList = new ArrayList(list);
Collections.sort(lengthList, lengthComparator); //collection sorted by string length

Сортирането на колекции не означава преместване на действителните елементи. Колекцията не съхранява реални обекти, а връзки към тях. Същото важи и за SQL таблиците. Реалните линии лъжат себе си и лъжат.

И когато трябва често да правим селекции за някое поле, тогава добавяме друг индекс към tableта (аналогично на нова колекция в Java) и сортираме редовете на tableта, съхраняваме техния сортиран ред в специален индексен файл.

Надявам се, че сравнението с Java помогна малко. Малко практика - и за вас използването на индекси също ще стане най-очевидното решение.

7.2 Добавяне на индекси към table

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

Добавянето на индекс към table е много просто:

ALTER TABLE table
    ADD INDEX index_name (column);

Ако често търсите записи в множество колони едновременно, можете да посочите съставен индекс: SQL използва множество колони, за да го състави.

Добавянето на съставен индекс към table също е много просто:

ALTER TABLE table
    ADD INDEX index_name (column 1, column 2, column 3, ...);

Индексите заемат много дисково пространство, така че ако вече не се нуждаете от индекс, винаги можете да го премахнете:

ALTER TABLE table
    DROP INDEX index_name;

Самите индекси са доста скрита част от базата данни. Те не влияят по ниHowъв начин на формата на писане на заявки. Просто присъствието им ускорява вземането на проби от данни и забавя тяхното добавяне и архивиране.

Но имайки предвид колко важна е скоростта в днешния свят и колко евтино е дисковото пространство, не се колеbyteе да добавите индекси за всички случаи. Извинете ме админи...