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е да добавите индекси за всички случаи. Извинете ме админи...
GO TO FULL VERSION