Использование индексов
Перед добавлением кортежей в спейс или выборкой кортежей из спейса необходимо создать индекс для этого спейса.
Простая операция создания индекса выглядит так:
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.
Операции с индексами выполняются автоматически: если запрос на изменение данных изменяет кортеж, то также изменяются и ключи индекса, определённые для этого кортежа.
- Создайте тестовый спейс с именем
bands:
bands = box.schema.space.create('bands')
- Отформатируйте созданный спейс, указав имена и типы полей:
box.space.bands:format({{ name = 'id', type = 'unsigned' },{ name = 'band_name', type = 'string' },{ name = 'year', type = 'unsigned' }})
- Создайте первичный индекс (с именем
primary). Этот индекс основан на полеidкаждого кортежа:
box.space.bands:create_index('primary', { parts = { 'id' } })
- Вставьте несколько кортежей в спейс:
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 }
- Создайте вторичные индексы:
-- 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 })
- Создайте составной индекс из двух частей:
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]...--]]