Перейти к содержимому
Последнее обновление

Оптимизация индексов: советы по использованию префиксных и инвертированных индексов

Обзор​

Индексы Doris — это структуры данных, которые ускоряют фильтрацию при выполнении запросов. Правильное использование индексов позволяет значительно повысить производительность запросов.

В настоящее время Doris поддерживает две категории индексов:

Категория индексовТипы индексовОсобенности
Встроенные индексыПрефиксный индекс, индекс ZoneMapАвтоматически формируются при создании таблицы и не требуют дополнительного обслуживания
Вторичные индексыИнвертированный индекс, индекс Bloomfilter, индекс N-Gram Bloomfilter, индекс BitmapСоздаются пользователями по мере необходимости и управляются независимо

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

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

Контрольный список перед чтением​

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

Пример 1: изменение порядка столбцов Key для ускорения запросов с помощью префиксных индексов​

В статье Оптимизация схемы таблицы описано, как выбрать подходящие поля Key и использовать сортировку по столбцам Key в Doris для ускорения запросов. Этот пример развивает рассмотренный там сценарий.

Исходные сведения​

В Doris есть встроенный префиксный индекс: при создании таблицы он автоматически формируется из первых 36 байт столбцов Key таблицы. Если условие запроса соответствует префиксу этого индекса, скорость выполнения запроса может значительно возрасти.

Проблема: порядок столбцов Key не соответствует характеру запросов​

Исходный оператор CREATE TABLE:

CREATE TABLE `t1` (
`c1` VARCHAR(10) NULL,
`c2` VARCHAR(10) NULL
) ENGINE=OLAP
DUPLICATE KEY(`c1`)
DISTRIBUTED BY HASH(`c2`) BUCKETS 10
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);

При этом в приложении используются следующие типичные SQL-запросы:

select * from t1 where t1.c2 = '1';
select * from t1 where t1.c2 in ('1', '2', '3');

В приведённой схеме сначала идёт c1, а за ним — c2, но запросы выполняют фильтрацию по полю c2. В таком случае префиксный индекс не может ускорить запросы.

Оптимизация: изменение порядка столбцов​

Разместите столбец c2 первым, чтобы префиксный индекс охватывал условие фильтрации прикладных запросов:

CREATE TABLE `t1` (
`c2` VARCHAR(10) NULL,
`c1` VARCHAR(10) NULL
) ENGINE=OLAP
DUPLICATE KEY(`c2`)
DISTRIBUTED BY HASH(`c1`) BUCKETS 10
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);
Совет по оптимизации

Определяя порядок столбцов в схеме, учитывайте столбцы, которые часто используются в условиях фильтрации прикладных запросов и имеют высокий приоритет. Это позволит в полной мере использовать префиксный индекс Doris для ускорения запросов.

Пример 2: использование инвертированных индексов для ускорения запросов​

Сценарии применения​

Doris поддерживает инвертированные индексы в качестве вторичных индексов для ускорения следующих задач:

  • Полнотекстовый поиск по текстовым полям;
  • Запросы с проверкой равенства по строковым, числовым полям или полям даты и времени;
  • Диапазонные запросы по строковым, числовым полям или полям даты и времени.

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

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

Типичные сценарии использования, синтаксис и примеры приведены в разделе Инвертированный индекс. Здесь они не повторяются.

Рекомендация по оптимизации

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

Сравнение индексов для выбора​

Тип индексаПодходящие запросыТребуется пересоздание таблицыТребуется повторная загрузка данныхТипичные поля
Префиксный индексПроверка равенства, диапазонные запросы, поиск по префиксуДа (изменение Key)ДаСтолбцы Key в начале порядка сортировки
Индекс ZoneMapФильтрация по диапазонуНет (автоматически)НетВсе столбцы
Инвертированный индексПолнотекстовый поиск, проверка равенства, диапазонные запросыНетНетСтроковые, числовые, дата и время
Индекс BloomfilterФильтрация по равенству для полей с высокой кардинальностьюНетНет (применяется по мере поступления данных)Строковые, числовые
N-Gram BloomfilterПоиск по шаблону LIKEНетНет (применяется по мере поступления данных)Строковые
Индекс BitmapФильтрация по равенству для полей с низкой кардинальностьюНетНет (применяется по мере поступления данных)Поля с перечислимым набором значений

Часто задаваемые вопросы и типичные проблемы​

Вопрос 1: почему запросы по-прежнему выполняются медленно после создания индекса?​

Возможные причины:

  • Условие запроса не использует ни один из индексированных столбцов;
  • Порядок столбцов Key не соответствует условию фильтрации, поэтому префиксный индекс не задействуется;
  • Объём данных мал, и индекс не даёт заметного выигрыша;
  • Индекс ещё не применяется к ранее записанным данным (некоторые вторичные индексы сразу начинают действовать только для новых записываемых данных).

Вопрос 2: нужно ли создавать префиксный индекс вручную?​

Нет. При создании таблицы Doris автоматически формирует префиксный индекс из первых 36 байт столбцов Key. Чтобы префиксный индекс работал эффективно, размещайте поля, часто используемые для фильтрации в прикладных запросах, в начале списка столбцов Key.

Вопрос 3: как выбрать между инвертированным индексом и индексом Bloomfilter?​

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

Вопрос 4: требуется ли пересоздавать таблицу при изменении порядка столбцов Key?​

Да. Порядок столбцов Key является частью определения схемы таблицы. После его изменения необходимо пересоздать таблицу и повторно загрузить данные.

Итоги​

При настройке схемы оптимизация индексов так же важна, как и оптимизация схемы на уровне таблицы. Doris предоставляет несколько типов индексов:

  • Встроенные индексы: префиксный индекс, индекс ZoneMap;
  • Вторичные индексы: инвертированный индекс, Bloomfilter, N-Gram Bloomfilter, Bitmap.

Правильное использование этих индексов позволяет значительно ускорить прикладные запросы и анализ данных в различных сценариях. Рекомендуется сначала определить поля, которые часто используются для фильтрации в прикладных запросах, а затем выбрать подходящий тип индекса с учётом возможности пересоздания таблицы, объёма данных и других факторов.