Перейти до основного вмісту
Модуль 10 · Урок 1 із 437/57 у курсі~15 min
Модульні уроки (1/4)

Індекси та B-дерева

Як база даних може знайти один запис серед мільйонів рядків за частки секунди?

За замовчуванням, коли ми запитуємо SELECT * FROM customers WHERE city = 'Milano', Postgres має виконати Послідовне сканування: він фізично зчитує всю таблицю з диска рядок за рядком, порівнюючи кожне місто з «Міланом». Коли таблиця містить мільйони записів, цей процес погіршує продуктивність.

Основною структурною відповіддю на ці вузькі місця є індекси.

Індекси (B-дерева)

Індекси працюють точно так само, як аналітичний покажчик у кінці великої книги. Замість того, щоб прочитати всю книгу, щоб знайти, де в ній йдеться про «Мілано», ми шукаємо останні сторінки, де слово «Мілано» перенаправляє нас до [p. 45, 114, 230]. Бази даних за лаштунками створюють цю окрему, дуже компактну структуру даних (часто «B-Tree»), упорядковану за відповідним стовпцем або стовпцями, що містить прямі вказівники на фізичне зберігання відповідних рядків.

SQL
-- Creare un indice semplice
CREATE INDEX idx_customers_city ON customers(city);

Ця єдина операція запускає механізм Postgres, який видобуватиме та індексуватиме всі значення city у фоновому режимі. Після завершення кожен наступний SELECT ... WHERE city = '...' літатиме!

Первинні ключі та унікальність

Чи знаєте ви, що правила первинного ключа (PRIMARY KEY) і UNIQUE таємно використовують індекси під капотом? Оскільки БД має гарантувати, що адреса електронної пошти чи ідентифікатор ніколи не дублюватимуться під час вставки чи зміни рядків, PostgreSQL автоматично створює поверх них неявний індекс B-Tree: таким чином перевірка унікальності займає мікросекунди.

Ось чому об’єднання в полі ID неймовірно продуктивні.

Видалення індексу

Якщо ви розумієте, що важкі запити змінилися, а індекс ніколи не звертається, доцільно знищити його та відновити життєво важливий простір:

SQL
DROP INDEX idx_customers_city;

Ваша черга

вправи#sql.m10.l1.e1
Спроби: 0Завантаження…

У нашій електронній комерції через інформаційні панелі ми помічаємо, що ми дуже часто фільтруємо клієнтів за національністю (стовпець країни в клієнтах). \nСтворіть новий базовий індекс у стовпці країни та назвіть його «idx_customers_country».

Завантаження редактора…
Показати підказку

Використовуйте CREATE INDEX index_name ON table_name(column_name);

Рішення доступне після 3 спроб

Вивчення вторинних унікальних індексів

вправи#sql.m10.l1.e2
Спроби: 0Завантаження…

Індекс B-Tree також можна використовувати для імітації обмеження UNIQUE під час створення та прискорення пошуку, одночасно роблячи логічний намір явним і примусовим.\n\nСтворіть новий індекс, де ви оголошуєте ключове слово UNIQUE. Визначте його так, щоб він блокував будь-які небажані повторювані реєстрації від інших користувачів, примусово створюючи унікальність для стовпця «електронна адреса» в «клієнтах», і назвіть його «idx_unique_email_customer».

Завантаження редактора…
Показати підказку

Напишіть CREATE UNIQUE INDEX index_name ON table(column);

Рішення доступне після 3 спроб