В каких случаях в SQL следует создавать индексы?

Ответ

Индексы создаются для ускорения операций поиска (SELECT), фильтрации (WHERE), соединения (JOIN) и сортировки (ORDER BY) в таблицах баз данных. Они работают как алфавитный указатель в книге, позволяя СУБД быстро найти нужные строки без полного последовательного сканирования таблицы (full table scan).

Основные случаи для создания индекса:

  1. Столбцы, часто используемые в условиях WHERE.
    -- Индекс ускорит поиск по `customer_id`
    SELECT * FROM orders WHERE customer_id = 12345;
  2. Столбцы, используемые в операциях JOIN.
    -- Индекс на `orders.user_id` ускорит соединение
    SELECT * FROM users
    JOIN orders ON users.id = orders.user_id;
  3. Столбцы, используемые для сортировки (ORDER BY) или группировки (GROUP BY).
  4. Столбцы с ограничениями 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». База туда глянет — и сразу на нужные места прыгнет. Скорость — овердохуища!

Так когда же этот самый указатель, блядь, создавать?

  1. Столбцы в WHERE. Самый частый случай. Если ты постоянно ищешь по customer_id или email — вешай индекс, не думай.
    -- Без индекса на customer_id это будет долгая песня, блядь
    SELECT * FROM orders WHERE customer_id = 12345;
  2. Столбцы для JOIN. Когда ты соединяешь таблицы, например, юзеров с их заказами, база ищет совпадения. Без индекса на orders.user_id она будет тупо перебирать все заказы для каждого юзера — это, простите, ебать-колотить сколько времени.
  3. Для сортировки (ORDER BY) и группировки (GROUP BY). Попробуй отсортировать миллион записей по дате без индекса — сходи за кофе, пока ждёшь.
  4. 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'. Индекс по нему нихуя не даст, потому что он отсеет максимум половину записей, а остальные всё равно придётся перебирать. Пиздец бесполезная затея.

Итог, чувак: Индексы — это палка о двух концах. С одной стороны, ускоряют чтение дохуя. С другой — жрут место и тормозят запись. Нужно искать баланс, а не лепить их на всё подряд, как дурак. Думай головой, что у тебя чаще: читают или пишут? Вот и ориентируйся.