Какие факторы нужно учитывать при проектировании индекса в базе данных?

Ответ

Создание эффективного индекса требует анализа запросов и данных. Основные критерии:

  1. Нагрузка запросов: Индексируйте столбцы, которые часто фигурируют в условиях WHERE, JOIN, ORDER BY, GROUP BY.
  2. Селективность: Приоритет — столбцы с высоким количеством уникальных значений (например, id, email). Индекс по полю с двумя значениями (gender) почти бесполезен.
  3. Тип индекса:
    • B-tree — для диапазонов (BETWEEN, >, <) и сортировки.
    • Hash — только для точного совпадения (=).
    • Составной (композитный) — для условий по нескольким столбцам. Порядок столбцов критичен!
  4. Влияние на запись: Каждый индекс замедляет операции INSERT, UPDATE, DELETE и увеличивает объем хранилища. Необходим баланс.

Пример составного индекса:

-- Индекс эффективен для запросов с условием по department_id ИЛИ по department_id + salary.
CREATE INDEX idx_emp_dept_salary ON employees (department_id, salary);

Ограничения: Индексы обычно не используются, если:

  • В условии применяется функция к столбцу (WHERE UPPER(name) = '...').
  • Используется LIKE с начальным wildcard ('%text').

Ответ 18+ 🔞

А, ну вот, опять про эти ваши индексы, блядь. Сидишь, значит, думаешь, как бы базу не угробить, а она тебе — «ой, всё медленно, ёпта!». Так, слушай сюда, разжую как для себя любимого.

Первое и главное, сука: не лепи индексы на всё подряд, как дурак! Каждый новый индекс — это как лишний рюкзак на твою INSERT/UPDATE операцию. Замедляет, блядь, и место жрёт. Баланс нужен, понимаешь? Чувство меры, ебать!

Теперь по пунктам, чтобы не распизделся:

1. Куда целиться? Смотри, какие запросы у тебя самые частые и самые дохлые. Глазами, блядь, смотри на WHERE, JOIN, ORDER BY, GROUP BY. Вот по этим полям и думай. Если поле в WHERE постоянно мелькает — кандидат.

2. Селективность — это святое! Представь, у тебя поле пол — два значения: «М» и «Ж». Ну и нахуя на него индекс? Чтобы выбрать половину таблицы? Ты чё, мудак? Это как искать иголку в стоге сена, а потом взять весь стог. Бесполезно, блядь! Индекс нужен на что-то уникальное, или почти уникальное: id, email, номер_паспорта. Чем уникальнее — тем жирнее польза.

3. Типы индексов — не еби мозг.

  • B-tree — дефолтная рабочая лошадка. Для всего: поиск по равенству, диапазоны (WHERE date > '2023'), сортировка. Бери его, если не уверен.
  • Hash — только для точного совпадения, когда тебе нужно = и ничего больше. Быстрее, но ограниченно. Как одноразовый стаканчик.
  • Составной индекс (композитный) — вот тут, блядь, нужно мозги включать. Порядок столбцов — ВСЁ! Он как пароль, ебать. Если индекс на (department_id, salary), то он сработает для поиска по department_id и для связки department_id + salary. А вот если ты полезешь искать только по salary — нихуя! Индекс проигнорируют. Запоминай: первый столбец в индексе — главный, как ключ от квартиры.

Вот, смотри, пример, чтобы в голове отложилось:

-- Делаем индекс. department_id — главный ключик.
CREATE INDEX idx_emp_dept_salary ON employees (department_id, salary);

Такой индекс, блядь, выручит, если ты ищешь всех из отдела 5 (WHERE department_id = 5) или всех из отдела 5 с зарплатой больше стакана (WHERE department_id = 5 AND salary > 100000). Умная штука.

4. Когда индекс — просто кусок бесполезного мяса? Бывает, сделаешь индекс, а запрос всё равно ползёт, как черепаха. Значит, накосячил. Индекс обычно не используют, если:

  • Ты начинаешь ебаться со столбцом через функцию: WHERE UPPER(name) = 'ВАСЯ'. База смотрит на индекс по name, а видит UPPER(name) — и пизда. Не совпало. Индекс — не для извращенцев.
  • Используешь LIKE с процентом в начале: WHERE name LIKE '%Вася'. Это как искать человека, зная только последнюю букву его имени — нихуя не найдёшь. Индекс тут бессилен. А вот 'Вася%' — уже ок, может прокатить.

Короче, суть в чём: думай, блядь, что ты чаще всего ищешь, делай индекс под это, не плоди хуйню и не трогай столбцы функциями на лету. Всё, можно идти пить чай.