Индексы: как они работают и когда их применять
Ускоряем чтение, позволяя базе сразу переходить к нужным строкам
INSERT, UPDATE и DELETE делает чуть больше работы, и сам индекс занимает место. Умение понять, когда этот размен окупается, — и есть весь навык.
- объяснить, почему запрос без индекса делает полное сканирование таблицы,
- описать, как B-tree-индекс сужает поиск до нескольких чтений,
- назвать, что индекс ускоряет (равенство, диапазоны,
ORDER BY, соединения) и чего он стоит, - выбирать хорошие столбцы, используя селективность и правило крайнего левого префикса для составных индексов,
- проверять, действительно ли используется индекс, с помощью
EXPLAIN, - распознавать случаи, когда индекс добавлять не нужно.
1. Проблема: полное сканирование таблицы
Все примеры на этой странице используют одну небольшую таблицу интернет-магазина. Создайте её один раз и загрузите несколько строк:
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
email VARCHAR(120),
city VARCHAR(50),
created_at DATE
);
INSERT INTO customers (customer_id, email, city, created_at) VALUES
(1, 'ana@shop.io', 'Bishkek', '2025-01-04'),
(2, 'omar@shop.io', 'Osh', '2025-01-09'),
(3, 'lena@shop.io', 'Bishkek', '2025-02-14'),
(4, 'raj@shop.io', 'Naryn', '2025-02-20'),
(5, 'mira@shop.io', 'Osh', '2025-03-02');
Теперь представьте, что в этой таблице миллион строк, и вы выполняете самый обычный поиск:
SELECT * FROM customers WHERE email = 'raj@shop.io';
Без индекса на email база не знает, где находится эта строка. Она вынуждена прочитать каждую строку и по очереди сравнить её email. Это и есть полное сканирование таблицы: на миллионе строк выполняется около миллиона сравнений, чтобы вернуть один результат.
Аналогия. Представьте учебник на 900 страниц без предметного указателя в конце. Чтобы найти все страницы, где упоминается «фотосинтез», пришлось бы пролистать все 900 страниц. Алфавитный указатель в конце меняет дело: вы переходите к букве «Ф», читаете одну строку, и она указывает точные страницы. Индекс базы данных — это такой же указатель, но для ваших строк.