Ответ
Ограничения на количество индексов зависят от конкретной СУБД и движка хранения.
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и смотреть, куда база упёрлась. Вот там и надо прикладывать индекс, как подорожник к больному месту. Всё остальное — от лукавого и желания сделать «на всякий случай, авось пригодится». Не пригодится, блядь.