Перейти к содержанию

CREATE INDEX

DDL-команда CREATE INDEX используется для создания индекса.

Синтаксис

CREATE UNIQUE INDEX IF NOT EXISTS index ON table USING TREE HASH RTREE BITSET ( column ASC DESC , ) WITH ( BLOOM_FPR RUN_SIZE_RATIO = decimal PAGE_SIZE RANGE_SIZE RUN_COUNT_PER_LEVEL DIMENSION = unsigned DISTANCE = EUCLID MANHATTAN HINT COMPRESSION_DICT = TRUE FALSE COMPRESSION_LEVEL = integer , ) WAIT APPLIED GLOBALLY LOCALLY OPTION ( TIMEOUT = double )

Параметры

  • UNIQUE — ограничение для создания уникального индекса

Примечание

Это ограничение доступно только для индекса TREE по колонкам ключа шардирования.

  • INDEX — имя индекса. Соответствует правилам имен для всех объектов в кластере

Имя индекса должно быть уникальным в рамках кластера!

  • IF NOT EXISTS — позволяет избежать ошибки в случае, если такой индекс в кластере уже есть

  • TABLE — имя таблицы. Соответствует правилам имен для всех объектов в кластере

  • USING — применяемый тип индекса: TREE, HASH, RTREE, BITSET

Типы индексов

  • TREE (vinyl, memtx) — универсальный и наиболее предпочтительный тип индекса. Поддерживает поиск по компонентам ключа. Характеристики:
    • уникальный
    • неуникальный
    • первичный
  • HASH (memtx) — присутствует для обратной совместимости. Характеристики:
    • уникальный
    • первичный
  • RTREE (memtx) — многомерный индекс, поддерживающий до 20 измерений. Используется, в частности, для индексирования пространственной информации. Характеристики:
    • неуникальный
  • BITSET (memtx) — используется для поиска по битовым маскам. Характеристики:
    • неуникальный
  • COLUMN — имя колонки. Соответствует правилам имен для всех объектов в кластере. Для каждой колонки индекса TREE можно указать порядок сортировки: ASC (по возрастанию) или DESC (по убыванию). Если порядок не указан, используется ASC. Например, (id DESC, name ASC). Указанный порядок определяет направление соответствующей части физического индекса. Для индексов HASH, RTREE и BITSET явный порядок сортировки не поддерживается
  • BLOOM_FPR (vinyl) — вероятность ложноположительного срабатывания фильтра Блума
  • RUN_SIZE_RATIO (vinyl) — соотношение между размерами разных уровней в LSM-дереве
  • PAGE_SIZE (vinyl) — размер страницы в байтах, используемой для операций чтения и записи на диск
  • RANGE_SIZE (vinyl) — максимальный размер LSM-поддерева по умолчанию в байтах
  • RUN_COUNT_PER_LEVEL (vinyl) — максимальное количество файлов на уровне в LSM-дереве
  • DIMENSION — размерность индекса RTREE
  • DISTANCE — способ определения расстояния в индексе RTREE: EUCLID, MANHATTAN
  • HINT (memtx) — оптимизация сравнения ключей в индексе TREE:
    • TRUE — в каждой записи индекса рядом с указателем на строку хранится дополнительная 8-байтовая подсказка (hint), заранее вычисленная по первой колонке ключа. При сравнении сначала сопоставляются подсказки: если они различаются, порядок ключей определяется без чтения строк; если совпадают — сравниваются сами значения ключей. Это ускоряет работу индекса
    • FALSE — подсказки не хранятся, запись индекса содержит только указатель на строку, а сравнение требует обращения к значениям ключей. Размер записи уменьшается с 16 до 8 байт, поэтому индекс занимает примерно вдвое меньше памяти
  • COMPRESSION_LEVEL (vinyl) — уровень сжатия данных в индексе. Применяется Zstd со шкалой уровней в диапазоне от -7 до 22. По умолчанию используется уровень сжатия 3. Значение 0 является служебным и означает "использовать сжатие по умолчанию"
  • COMPRESSION_DICT (vinyl) — включает сжатие данных в индексе с помощью словаря Zstd: TRUE или FALSE. Словарь обучается автоматически при дампе и компактизации. Такое сжатие наиболее эффективно для структурированных данных (например, документов JSON или записей журнала) при небольшом размере страницы. По умолчанию используется значение FALSE
  • WAIT APPLIED — при использовании этого параметра контроль пользователю будет возвращен только после того как данная операция будет применена либо во всем кластере (GLOBALLY), либо в рамках текущего инстанса (LOCALLY)
  • TIMEOUT — интервал времени, за который Picodata пытается создать индекс. Если времени не хватило и вернулась ошибка, то или индекс не успел создаться, или создался, но нам не хватило времени получить об этом подтверждение. Чтобы проверить статус индекса, можно повторить еще раз команду его создания. Если индекс создан, то в результате вернется нуль строк. Если же индекс не был создан, то вернется одна строка. Если параметр не указан, используется значение системного параметра sql_ddl_timeout (по умолчанию 86400 секунд).

См. также:

Требуемые привилегии

Данная команда требует привилегии CREATE INDEX.

См. также:

Примеры

Подготовка тестового окружения

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

CREATE INDEX product_quantity
ON deliveries
USING TREE
(product ASC, quantity DESC)
WITH (
HINT = true,
BLOOM_FPR = 0.05,
RUN_SIZE_RATIO = 3.5,
PAGE_SIZE = 8192,
RANGE_SIZE = 1073741824,
RUN_COUNT_PER_LEVEL = 2
)
OPTION (
TIMEOUT = 3.0
);