Каковы ограничения на количество индексов в таблице базы данных?

Ответ

Ограничения на количество индексов зависят от конкретной СУБД и движка хранения.

MySQL (InnoDB):

  • Максимум индексов на таблицу: 64 вторичных индекса.
  • Максимум столбцов во всех индексах: 1017 (ранее 1024).
  • Ограничение длины ключа индекса: 3072 байта.

Пример создания таблицы с индексами:

CREATE TABLE users (
    id INT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL,
    country_code CHAR(2),
    INDEX idx_username (username),
    INDEX idx_email (email),
    INDEX idx_country (country_code)
);

PostgreSQL: Не имеет жесткого встроенного лимита, но практические ограничения накладываются производительностью и дисковым пространством.

Практические рекомендации (универсальные):

  • Качество важнее количества: Создавайте индексы для столбцов, используемых в условиях WHERE, JOIN и ORDER BY.
  • Накладные расходы: Каждый индекс замедляет операции INSERT, UPDATE, DELETE, так как его структуру данных (например, B-дерево) также необходимо обновлять.
  • Оптимальное число: Для большинства таблиц достаточно 5-10 осмысленных индексов. Анализируйте медленные запросы с помощью EXPLAIN для целевого создания индексов.

Ответ 18+ 🔞

А, слушай, про индексы в базах — это вообще отдельная песня, блядь. Тут главное не наебнуться с количеством, потому что у каждой СУБД свои приколы, как у сумасшедшей тёщи свои тараканы в голове.

Вот смотри, в MySQL, особенно на InnoDB, у них там свои правила, блядь. На одну таблицу можно навесить максимум 64 вторичных индекса. Не 65, не «ой, ещё одинокий», а 64, и всё, пиздец. И столбцов во всех этих индексах вместе взятых — 1017 штук. Раньше было 1024, но видимо, кто-то посчитал, что 1017 — число более ёбаное. А ещё длина ключа индекса не должна превышать 3072 байта, так что если ты задумал проиндексировать свою автобиографию в одном поле — забей, не выйдет.

Вот, например, как это выглядит в коде, тут всё чётко:

CREATE TABLE users (
    id INT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL,
    country_code CHAR(2),
    INDEX idx_username (username),
    INDEX idx_email (email),
    INDEX idx_country (country_code)
);

А вот в PostgreSQL — там вообще раздолье, блядь. Жёсткого лимита нет, в рот меня чих-пых! Можно хоть всю таблицу индексами обвешать, как новогоднюю ёлку. Но тут уже здравый смысл должен вступить в дело, потому что производительность и место на диске — они не резиновые, ёпта.

Теперь самое важное, практические советы, которые от зубов отскакивают:

  • Качество важнее количества, блядь! Не надо индексировать всё подряд, как последний распиздяй. Индекс — это для столбцов, которые реально в WHERE, JOIN или ORDER BY мелькают. Индекс на поле «любимый цвет» в таблице заказов — это пиздец какой идиотизм.
  • Накладные расходы, сука! Каждый новый индекс — это как ещё один ребёнок в семье. За ним надо ухаживать. Каждая операция INSERT, UPDATE, DELETE будет тормозить, потому что БД будет обновлять не только данные, но и все эти ебученькие B-деревья индексов. Больше индексов — медленнее запись. Запомни это, как «Отче наш».
  • Оптимальное число. Для нормальной, адекватной таблицы обычно хватает 5-10 осмысленных индексов. Не 50, Карл! Десять! Если у тебя их больше — ты либо гений, либо еблан. Самый верный путь — это ловить медленные запросы, делать по ним EXPLAIN и смотреть, куда база упёрлась. Вот там и надо прикладывать индекс, как подорожник к больному месту. Всё остальное — от лукавого и желания сделать «на всякий случай, авось пригодится». Не пригодится, блядь.