Оптимизация индексов: советы по использованию префиксных и инвертированных индексов
Обзор
Индексы 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.
Правильное использование этих индексов позволяет значительно ускорить прикладные запросы и анализ данных в различных сценариях. Рекомендуется сначала определить поля, которые часто используются для фильтрации в прикладных запросах, а затем выбрать подходящий тип индекса с учётом возможности пересоздания таблицы, объёма данных и других факторов.