Индексирование колонок с низкой кардинальностью в MySQL

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Да, индексы с низкой кардинальностью в определённых обстоятельствах могут значительно улучшить производительность, особенно если они включены в составные индексы вместе с другими колонками. Это приводит к ускорению операций чтения, когда дублирующие запросы соответствуют индексируемым полям:

SQL
Скопировать код
-- Создание составного индекса – история намного интереснее, чем "Сумерки"
CREATE INDEX idx_myFantasticIndex ON myLargeTable(status, lastAccessed);

В данном случае объединение колонки status с ограниченным набором уникальных значений и lastAccessed способствует ускорению поиска данных, сделав его более эффективным, нежели полный перебор таблицы.

Подробный разбор: В каких случаях уместно использование индексов с низкой кардинальностью?

Пример использования – Повышение производительности с order-by/limit

В определённых сценариях индексы с низкой кардинальностью могут быть очень полезными, например, при использовании операторов ORDER BY в сочетании с LIMIT. Они способны значительно сократить время выполнения запросов, приравнивая его к простоте воскресной прогулки на автомобиле.

Редкие значения – Важность малочастотных записей

Индекс оказывается полезным, когда поля содержат значения, редко встречающиеся в базе данных, несмотря на их низкую кардинальность. Создание индекса может не сильно отразиться на операциях DML, но если производительность не пострадает, то его использование будет оправдано.

Составные индексы – Сила правильного сочетания

Составной индекс, включающий поле с низкой кардинальностью, может значительно снизить количество операций ввода/вывода при сочетании этого поля с колонками с высокой отборочной способностью. Это ключ к ускорению работы приложения, делающий его быстрым, как антилопу.

Тестирование – Путь к оптимальным результатам

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

Визуализация

Сравним работу базы данных с аэропортом, где строки сопоставимы с пунктами назначения рейсов:

Markdown
Скопировать код
🛬 Аэропорт (Таблица данных)        ✈️✈️✈️✈️✈️✈️✈️✈️
✈️ Пункты назначения рейсов (Индексированный столбец) 🌆🌁🌄🌁🌅🌆🌆🌅

Индекс по пунктам назначения (столбец с низкой кардинальностью) фактически действует как специальная взлётно-посадочная полоса для самолётов, следующих в популярные направления:

Markdown
Скопировать код
🚥 Спецполоса для 🌅 Пляжных направлений
✈️  Очередь самолётов   🌆🌅🌇🌄🌅🌆🌄
🚥 Приоритет для пляжных рейсов!   🌅🌅🌅

Приоритет, предоставляемый индексом небольшой кардинальности:

Markdown
Скопировать код
- Ограниченное применение 🛸: Только некоторым данным придётся переиграть.
- Существенный эффект 🚀: Эти несколько рейсов благодаря приоритету вылетят быстрее.

Даже если уникальных пунктов назначения мало, индекс может ускорить выполнение специфических запросов.

Контекст важен – Особенности DBMS

Необходимо учесть специфику вашей системы управления базами данных. Например, в MySQL 5 оптимизатор запросов может выбрать не использовать индекс, если он найдёт более effективное решение или размер таблицы не достаточно большой.

Соображения при использовании индексов – У всего есть своя цена

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

Поддержание порядка – Индексы и сортировка

Дополнительно, индексы с низкой кардинальностью могут быть полезным инструментом при сортировке данных, включая операции ORDER BY. Тестирование поможет понять, стоит ли продолжать поддержку существующих индексов.

Полезные материалы

  1. MySQL :: Руководство по MySQL 8.0 :: 10.3.1 Как MySQL использует индексы — Подробная информация о способах организации работы с индексами в MySQL для оптимизации запросов.
  2. SQL Server и Azure SQL индекс архитектура и руководство по дизайну – SQL Server — Современные методы проектирования индексов в базах данных SQL Server.
  3. Бит-мап индексы и низкая кардинальность — Содержательное погружение в мир особенностей бит-мап индексов и их применения при nизкой кардинальности данных.