Tarantool CE/EE Documentation portal logo
Помощь
Обновлена 15 сентября 2026 г. в 08:55

Использование индексов

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

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

Простая операция создания индекса выглядит так:

box.space.<space_name>:create_index('<index_name>')

Это создаёт уникальный TREE индекс по первому полю всех кортежей (часто называемому «Field#1»), которое предполагается числовым.

Рекомендуемый шаблон проектирования модели данных — основывать первичные ключи на первых полях кортежа. Это ускоряет сравнение кортежей благодаря специфике хранения данных и организации сравнений в Tarantool.

Простой запрос SELECT выглядит так:

box.space.<space_name>:select(<value>)

Этот запрос выполняет поиск одного кортежа через первый индекс. Поскольку первый индекс всегда уникален, максимальное число возвращаемых кортежей равно 1. Можно вызвать select() без аргументов — тогда будут возвращены все кортежи. Будьте осторожны: использование select() для больших спейсов может привести к зависанию экземпляра.

Определение индекса может также включать идентификаторы полей кортежа и их ожидаемые типы. Допустимые типы индексированных полей см. в разделе Типы индексируемых полей:

box.space.<space_name>:create_index(<index_name>, {type = 'tree', parts = {{field = 1, type = 'unsigned'}}}

Определения спейсов и индексов постоянно хранятся в системных спейсах Tarantool _space и _index.

Операции с индексами

Операции с индексами выполняются автоматически: если запрос на изменение данных изменяет кортеж, то также изменяются и ключи индекса, определённые для этого кортежа.

  1. Создайте тестовый спейс с именем bands:
bands = box.schema.space.create('bands')
  1. Отформатируйте созданный спейс, указав имена и типы полей:
box.space.bands:format({    { name = 'id', type = 'unsigned' },    { name = 'band_name', type = 'string' },    { name = 'year', type = 'unsigned' }})
  1. Создайте первичный индекс (с именем primary). Этот индекс основан на поле id каждого кортежа:
box.space.bands:create_index('primary', { parts = { 'id' } })
  1. Вставьте несколько кортежей в спейс:
box.space.bands:insert { 1, 'Roxette', 1986 }box.space.bands:insert { 2, 'Scorpions', 1965 }box.space.bands:insert { 3, 'Ace of Base', 1987 }box.space.bands:insert { 4, 'The Beatles', 1960 }box.space.bands:insert { 5, 'Pink Floyd', 1965 }box.space.bands:insert { 6, 'The Rolling Stones', 1962 }box.space.bands:insert { 7, 'The Doors', 1965 }box.space.bands:insert { 8, 'Nirvana', 1987 }box.space.bands:insert { 9, 'Led Zeppelin', 1968 }box.space.bands:insert { 10, 'Queen', 1970 }
  1. Создайте вторичные индексы:
-- Create a unique secondary index --box.space.bands:create_index('band', { parts = { 'band_name' } })-- Create a non-unique secondary index --box.space.bands:create_index('year', { parts = { { 'year' } }, unique = false })
  1. Создайте составной индекс из двух частей:
box.space.bands:create_index('year_band', { parts = { { 'year' }, { 'band_name' } } })

Возможны следующие варианты SELECT:

  • В поиске можно использовать сравнения, отличные от проверки на равенство:
-- Select maximum 3 tuples with the key value greater than 1965 --select_greater = bands.index.year:select({ 1965 }, { iterator = 'GT', limit = 3 })--[[---- - [9, 'Led Zeppelin', 1968]  - [10, 'Queen', 1970]  - [1, 'Roxette', 1986]...--]]

Операторы сравнения:

  • LT — «меньше»
  • LE — «меньше или равно»
  • GT — «больше»
  • GE — «больше или равно»
  • EQ — «равно»
  • REQ — «обратное равно»

Сравнение значений имеет смысл только в том случае, если тип индекса — TREE. Типы итераторов для других типов индексов немного отличаются и работают иначе. Подробности см. в разделе ссылка.

Обратите внимание, что имя индекса не используется — это означает, что здесь используется первичный индекс.

Такой тип поиска может вернуть более одного кортежа. Кортежи будут отсортированы по ключу в порядке убывания, если используется оператор сравнения LT, LE или REQ. В остальных случаях сортировка выполняется в порядке возрастания.

  • В поиске можно использовать вторичный индекс.
-- Select a tuple by the specified secondary key value --select_secondary = bands.index.band:select { 'The Doors' }--[[---- - [7, 'The Doors', 1965]...--]]
  • Поиск по частичному ключу: поиск может выполняться по некоторым частям ключа, начиная с префикса ключа. Обратите внимание, что поиск по частичному ключу доступен только в индексах типа TREE.
-- Select tuples by the specified partial key value --select_multipart_partial = bands.index.year_band:select { 1965 }--[[---- - [5, 'Pink Floyd', 1965]  - [2, 'Scorpions', 1965]  - [7, 'The Doors', 1965]...--]]
  • Поиск может выполняться по всем полям, при этом в качестве значения используется таблица:
-- Select a tuple by the specified multi-part secondary key value --select_multipart = bands.index.year_band:select { 1960, 'The Beatles' }--[[---- - [4, 'The Beatles', 1960]...--]]