Ответ
Индексы создаются для ускорения операций поиска (SELECT), фильтрации (WHERE), соединения (JOIN) и сортировки (ORDER BY) в таблицах баз данных. Они работают как алфавитный указатель в книге, позволяя СУБД быстро найти нужные строки без полного последовательного сканирования таблицы (full table scan).
Основные случаи для создания индекса:
- Столбцы, часто используемые в условиях
WHERE.-- Индекс ускорит поиск по `customer_id` SELECT * FROM orders WHERE customer_id = 12345; - Столбцы, используемые в операциях
JOIN.-- Индекс на `orders.user_id` ускорит соединение SELECT * FROM users JOIN orders ON users.id = orders.user_id; - Столбцы, используемые для сортировки (
ORDER BY) или группировки (GROUP BY). - Столбцы с ограничениями
PRIMARY KEYилиUNIQUE(индексы создаются автоматически).
Пример создания индекса:
-- Создание некластеризованного индекса по столбцу `email`
CREATE INDEX idx_users_email ON users(email);
-- Создание составного индекса для часто совместно используемых условий
CREATE INDEX idx_orders_status_date ON orders(status, created_date);
Когда индексы могут быть излишни или вредны:
- На маленьких таблицах, где полное сканирование выполняется быстрее.
- На столбцах с частыми операциями
INSERT/UPDATE/DELETE— каждый индекс замедляет эти операции, так как его тоже нужно обновлять. - На столбцах с низкой селективностью (например,
genderсо значениями 'M'/'F'), где индекс неэффективен.
Важно: Индексы занимают дополнительное дисковое пространство и требуют баланса между скоростью чтения и скоростью записи.
Ответ 18+ 🔞
Э, слушай, давай разберём эту тему про индексы, а то народ часто нихуя не понимает, зачем они и когда их лепить.
Представь себе здоровенную таблицу, книжищу на тысячу страниц, где все записи вперемешку. И тебе надо найти все заказы какого-то Васьки Пупкина. Без индекса база, как дура, будет листать эту книгу с первой до последней страницы, строчка за строчкой — это и есть тот самый full table scan, пиздец как медленно. А индекс — это типа алфавитного указателя в конце, где сразу написано: «Пупкин, Вася — смотри страницы 45, 78, 203». База туда глянет — и сразу на нужные места прыгнет. Скорость — овердохуища!
Так когда же этот самый указатель, блядь, создавать?
- Столбцы в
WHERE. Самый частый случай. Если ты постоянно ищешь поcustomer_idилиemail— вешай индекс, не думай.-- Без индекса на customer_id это будет долгая песня, блядь SELECT * FROM orders WHERE customer_id = 12345; - Столбцы для
JOIN. Когда ты соединяешь таблицы, например, юзеров с их заказами, база ищет совпадения. Без индекса наorders.user_idона будет тупо перебирать все заказы для каждого юзера — это, простите, ебать-колотить сколько времени. - Для сортировки (
ORDER BY) и группировки (GROUP BY). Попробуй отсортировать миллион записей по дате без индекса — сходи за кофе, пока ждёшь. PRIMARY KEYиUNIQUE. Тут за тебя уже всё сделали, индексы создаются автоматом, не парься.
Создаётся это дело просто:
-- Вешаем индекс на почту, чтобы быстро искать пользователей
CREATE INDEX idx_users_email ON users(email);
-- А вот составной индекс, хитрая жопа, для частых запросов вроде "покажи все завершённые заказы за вчера"
CREATE INDEX idx_orders_status_date ON orders(status, created_date);
А теперь, внимание, блядь, когда индексы — это зло!
- На таблицах размером с носовой платок. Если там 100 строк, то полное сканирование — мгновенно, а возня с индексом только время потратит. Не выёбывайся.
- На столбцах, которые постоянно меняются. Каждый
INSERT,UPDATEилиDELETE— это не только изменение таблицы, но и обновление всех индексов по ней. Навешаешь их десяток — и запись будет тормозить так, что волнение ебать. - На столбцах с хуёвой селективностью. Что такое селективность? Ну, вот есть столбец
пол. Там два значения: 'M' и 'F'. Индекс по нему нихуя не даст, потому что он отсеет максимум половину записей, а остальные всё равно придётся перебирать. Пиздец бесполезная затея.
Итог, чувак: Индексы — это палка о двух концах. С одной стороны, ускоряют чтение дохуя. С другой — жрут место и тормозят запись. Нужно искать баланс, а не лепить их на всё подряд, как дурак. Думай головой, что у тебя чаще: читают или пишут? Вот и ориентируйся.