Using indexes | Tarantool
Документация на русском языке
поддерживается сообществом

Using indexes

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

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

box.space.space-name:create_index('index-name')

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

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

Вот простой запрос SELECT:

box.space.space-name:select(value)

Такой запрос ищет отдельный кортеж, используя первичный индекс. Поскольку первичный индекс всегда уникален, то данный запрос вернет не более одного кортежа. Можно также вызвать select() без аргументов, чтобы вернуть все кортежи. Осторожно! Если вызвать select() без аргументов в огромном спейсе, ваш экземпляр зависнет.

An index definition may also include identifiers of tuple fields and their expected types. See allowed indexed field types in section Details about indexed field types:

box.space.space-name:create_index(index-name, {type = 'tree', parts = {{field = 1, type = 'unsigned'}}}

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

Примечание

Полную информацию о создании индексов, например о создании индексов по массиву (multikey), индексов с использованием пути path или функциональных индексов см. в справочнике space_object:create_index().

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

  1. Для примера создадим спейс с именем bands:

    bands = box.schema.space.create('bands')
    
  2. Отформатируем созданный спейс, указав имена и типы полей:

    box.space.bands:format({
        { name = 'id', type = 'unsigned' },
        { name = 'band_name', type = 'string' },
        { name = 'year', type = 'unsigned' }
    })
    
  3. Создадим первичный индекс с именем primary:

    box.space.bands:create_index('primary', { parts = { 'id' } })
    

    This index is based on the id field of each tuple.

  4. Вставим несколько кортежей в спейс:

    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 }
    
  5. Create secondary indexes:

    -- 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 })
    
  6. Create a multi-part index with two parts:

    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 for «greater than or equal»
    • EQ for «equal»
    • 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]
    ...
    --]]
    
  • Поиск можно производить по всем полям через запись в виде таблицы:

    -- 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]
    ...
    --]]
    

Примечание

С некоторыми ограничениями можно добавлять, удалять или изменять определения во время исполнения кода. Более подробную информацию об операциях с индексами см. в справочнике по вложенному модулю box.index.

Нашли ответ на свой вопрос?
Обратная связь