Индексы
Индексы помогают быстро находить данные, соответствующие определённым условиям запроса. В частности, когда индекс построен на таблице на основе некоторых её столбцов, запросы, использующие эти столбцы в качестве условий, требуют сканирования только части данных таблицы для поиска данных, удовлетворяющих условиям. Таким образом повышается эффективность запросов. Selena предоставляет различные типы индексов, которые в основном делятся на следующие две категории:
- Selena предоставляет встроенные индексы, которые автоматически создаются системой, включая Prefix индексы, Ordinal индексы и ZoneMap индексы.
- Selena также позволяет пользователям создавать индексы вручную, включая Bitmap индексы и Bloom filter индексы.
Встроенные индексы
Prefix индексы
Prefix индекс автоматически генерируется во время записи данных. Точнее, когда данные записываются в Selena, они сортируются в соответствии с указанным ключом сортировки, и каждые 1024 строки данных включаются в один логический блок данных. Индексная запись, состоящая из значений столбцов ключа сортировки первой строки данных в этом логическом блоке, добавляется в таблицу Prefix индекса. Когда условие фильтрации в запросе совпадает с префиксом Prefix индекса, Prefix индекс может быстро найти данные, соответствующие условиям, и уменьшить объём сканируемых данных, что значительно улучшает производительность запросов.
Ordinal индексы
Selena фактически использует колоночное хранилище в базовом слое хранения. Данные каждого столбца хранятся на страницах данных, размер каждой страницы данных обычно составляет 64 * 1024 байта (data_page_size = 64 * 1024). Запись Ordinal индекса добавляется одновременно с генерацией страницы данных. Запись Ordinal индекса содержит информацию, такую как начальный номер строки страницы данных. Таким образом, Ordinal индекс может определить физический адрес страницы данных столбца, используя номер строки.

ZoneMap индексы
ZoneMap индекс хранит статистику каждого блока данных, включающую Min (минимальное значение), Max (максимальное значение), HasNull (наличие null значений) и HasNotNull (наличие не-null значений). Во время запросов Selena может быстро оценить, можно ли отфильтровать эти блоки данных на основе их статистики, уменьшая объём сканируемых данных и повышая скорость запросов.
Дополнительная информация
Каждый блок данных может быть segment или страницей данных столбца. Соответственно, существуют два типа ZoneMap индексов: один хранит статистику для каждого Segment, а другой для каждой страницы данных столбца.
Индексы, созданные вручную
Если столбец в условии запроса не является префиксным полем, вы можете вручную создать индекс для этого столбца на основе характеристик данных и запросов для повышения эффективности запросов.
Bitmap индексы
Bitmap индекс подходит для запросов по столбцам с высокой кардинальностью или комбинациям нескольких столбцов с низкой кардинальностью. И bitmap индекс может демонстрировать идеальную производительность фильтрации для таких запросов, отфильтровывая как минимум 999 из 1000 строк.
Bloom filter индексы
Bloom filter индекс подходит для столбцов с относительно высокой кардинальностью, таких как столбцы ID, но может иметь определённый уровень ложных срабатываний.
N-Gram bloom filter индексы
N-gram bloom filter индекс — это специальный тип Bloom filter индекса, обычно используемый для ускорения запросов LIKE или операций функций ngram_search и ngram_search_case_insensitive.
Полнотекстовые inverted индексы
Полнотекстовый inverted индекс может быстро находить строки данных, соответствующие ключевым словам, тем самым ускоряя полнотекстовый поиск.
Vector индексы
Vector индекс позволяет выполнять приблизительный поиск ближайших соседей (ANNS) с помощью Selena.