Bitmap-индекс

В этом разделе описано, как создавать и управлять bitmap‑индексом, а также приведены сценарии использования.

Введение

Bitmap‑индекс — это специальный индекс базы данных, который использует битовые карты (массивы битов). Бит принимает одно из двух значений: 0 или 1. Каждый бит в битовой карте соответствует одной строке таблицы. Значение бита зависит от значения соответствующей строки данных.

Bitmap‑индекс помогает повысить производительность запросов по заданному столбцу. Если условия фильтрации в запросе совпадают с префиксом Prefix‑индекса, это значительно ускоряет выполнение и возврат результатов. Однако в таблице может быть только один Prefix‑индекс. Если условия фильтрации не включают префикс Prefix‑индекса, для такого столбца можно создать bitmap‑индекс, чтобы ускорить запросы.

Как спроектировать bitmap‑индекс для ускорения запросов

Основные факторы выбора bitmap‑индекса — это кардинальность столбца и фильтрующий эффект индекса. Вопреки распространённому мнению, в StarRocks bitmap‑индексы лучше подходят для запросов по высококардинальным столбцам и по комбинациям нескольких низкокардинальных столбцов. Кроме того, bitmap‑индекс должен эффективно отбрасывать данные — как минимум 999 из 1000 строк — чтобы уменьшать объём читаемых Page‑страниц.

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

При оценке эффективности учитывайте стоимость чтения страниц: в StarRocks данные организованы постранично (по умолчанию 64K). Затраты включают чтение страниц с диска, распаковку и декодирование.

Слишком высокая кардинальность может повлечь рост занимаемого места, а также влияние на производительность загрузки (индекс строится при записи). Дополнительно следует учитывать накладные расходы подгрузки индекса в запросах: чем выше отношение «число значений в условиях / кардинальность × bitmap‑индекс», тем выше расходы на загрузку индекса во время запроса.

Чтобы определить подходящую кардинальность и предикаты для bitmap‑индексов, рекомендуется ориентироваться на раздел Performance test on bitmap index и провести испытания на реальных данных/запросах: создать индексы на столбцах разной кардинальности и сравнить фильтрацию (как минимум 999/1000), занимаемый диск, влияние на загрузку и накладные расходы при выполнении запросов.

StarRocks имеет встроенный механизм адаптивного выбора bitmap‑индексов. Если индекс не ускоряет запросы (плохо отбрасывает страницы или накладные расходы его загрузки велики), он не будет использован, чтобы не ухудшать производительность.

Адаптивное использование bitmap-индексов

StarRocks может адаптивно решать, использовать ли bitmap‑индекс, на основе кардинальности столбца и условий запроса. Если индекс не отбрасывает достаточно страниц либо его подгрузка слишком затратна, по умолчанию он не применяется.

Критерий — отношение числа значений в предикатах к кардинальности столбца. Чем отношение меньше, тем сильнее эффект фильтрации. В качестве порога используется bitmap_max_filter_ratio/1000. Если значения_в_фильтре/кардинальность < bitmap_max_filter_ratio/1000, индекс будет использован. Значение bitmap_max_filter_ratio по умолчанию — 1.

Пример: для одного столбца gender с двумя значениями предикат по одному значению даёт отношение 1/2 > 1/1000 — индекс не используется. Для комбинации нескольких столбцов отношение может оказаться ниже порога — индекс будет применён.

Диапазон bitmap_max_filter_ratio: 1–1000. При 1000 любой запрос по столбцу с bitmap‑индексом принудительно использует его.

Преимущества

  • Быстро находит номера строк по значениям столбца — подходит для точечных и узких диапазонных запросов.

  • Оптимизирует многомерные запросы с объединениями/пересечениями (OR и AND).

Особенности

Запросы, которые можно оптимизировать

Подходят: =, [NOT] IN, >, >=, <, <=, IS NULL. Не подходят: !=, [NOT] LIKE.

Поддерживаемые столбцы и типы

Bitmap‑индексы можно создавать на всех столбцах таблиц Primary Key и Duplicate Key, а также на key‑столбцах Aggregate и Unique Key. Поддерживаемые типы:

  • Дата: DATE, DATETIME.

  • Числа: TINYINT, SMALLINT, INT, BIGINT, LARGEINT, DECIMAL, BOOLEAN.

  • Строки: CHAR, STRING, VARCHAR.

  • Прочие: HLL.

Базовые операции

Создание индекса

  • При создании таблицы:

    CREATE TABLE `lineorder_partial` (
      `lo_orderkey` int(11) NOT NULL COMMENT "",
      `lo_orderdate` int(11) NOT NULL COMMENT "",
      `lo_orderpriority` varchar(16) NOT NULL COMMENT "",
      `lo_quantity` int(11) NOT NULL COMMENT "",
      `lo_revenue` int(11) NOT NULL COMMENT "",
       INDEX lo_orderdate_index (lo_orderdate) USING BITMAP
    ) ENGINE=OLAP 
    DUPLICATE KEY(`lo_orderkey`)
    DISTRIBUTED BY HASH(`lo_orderkey`) BUCKETS 1;
    

    В этом примере создаётся bitmap‑индекс lo_orderdate_index на столбце lo_orderdate. В одной таблице нельзя создавать одинаковые bitmap‑индексы. Можно определить несколько индексов для разных столбцов, перечисляя их через запятую.

  • После создания таблицы — через CREATE INDEX:

    CREATE INDEX lo_quantity_index ON lineorder_partial (lo_quantity) USING BITMAP;
    

Прогресс создания индекса

Создание bitmap‑индекса — асинхронная операция. После запуска проверьте прогресс через SHOW ALTER TABLE. Когда поле State станет FINISHED, индекс создан.

SHOW ALTER TABLE COLUMN;

В таблице одновременно может выполняться только одна задача Schema Change.

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

Просмотреть все bitmap‑индексы таблицы можно с помощью SHOW INDEX.

SHOW INDEXES FROM lineorder_partial;

Команда показывает только успешно созданные индексы.

Удаление индекса

Удалить bitmap‑индекс для указанной таблицы можно с помощью DROP INDEX:

DROP INDEX lo_orderdate_index ON lineorder_partial;

Проверить, ускоряет ли индекс запросы

Проверьте поле BitmapIndexFilterRows в профиле запроса.