Tarantool CE/EE Documentation portal logo
Помощь

Операции

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

Базовые операции с данными, поддерживаемые в Tarantool:

  • пять операций изменения данных (INSERT, UPDATE, UPSERT, DELETE, REPLACE) и
  • одна операция получения данных (SELECT). Все они реализованы в виде функций в подмодуле box.space.

Примеры:

  • INSERT: добавление нового кортежа в спейс tester.

    Первое поле, field[1], будет равно 999 (тип MsgPack — integer).

    Второе поле, field[2], будет равно 'Taranto' (тип MsgPack — string).

    tarantool> box.space.tester:insert{999, 'Taranto'}
  • UPDATE: обновление кортежа с изменением поля field[2].

    Выражение "{999}", содержащее значение для поиска в индексе поля первичного ключа кортежа, является обязательным, так как запросы update() всегда должны содержать выражение, задающее уникальный ключ, в данном случае — field[1].

    Выражение "{{'=', 2, 'Tarantino'}}" указывает, что полю field[2] будет присвоено новое значение.

    tarantool> box.space.tester:update({999}, {{'=', 2, 'Tarantino'}})
  • UPSERT: выполнение upsert для кортежа с повторным изменением поля field[2].

    Синтаксис upsert() похож на синтаксис update(). Однако логика выполнения этих двух запросов различается. UPSERT — это либо UPDATE, либо INSERT, в зависимости от состояния базы данных. Кроме того, выполнение UPSERT откладывается до фиксации транзакции, поэтому, в отличие от update(), upsert() не возвращает данные.

    tarantool> box.space.tester:upsert({999, 'Taranted'}, {{'=', 2, 'Tarantism'}})
  • REPLACE: замена кортежа с добавлением нового поля.

    Это также можно сделать с помощью запроса update(), но запрос update() обычно сложнее.

    tarantool> box.space.tester:replace{999, 'Tarantella', 'Tarantula'}
  • SELECT: получение кортежа.

    Выражение "{999}" по-прежнему обязательно, хотя оно не обязательно должно указывать первичный ключ.

    tarantool> box.space.tester:select{999}
  • DELETE: удаление кортежа.

В этом примере мы указываем поле первичного ключа.

tarantool> box.space.tester:delete{999}

Резюмируем примеры:

  • Функции insert и replace принимают кортеж (первичный ключ передается как часть кортежа).
  • Функция upsert принимает кортеж (первичный ключ передается как часть кортежа), а также операции обновления для выполнения.
  • Функция delete принимает полный ключ любого уникального индекса (первичного или вторичного).
  • Функция update принимает полный ключ любого уникального индекса (первичного или вторичного), а также операции для выполнения.
  • Функция select принимает любой ключ: первичный/вторичный, уникальный/неуникальный, полный/частичный.

Подробнее об использовании операций с данными см. в справочнике по box.space.

Факторы сложности

В справочнике по вложенным модулям box.space и box.index содержатся примечания о том, какие факторы сложности могут влиять на потребление ресурсов каждой функцией.

Фактор

Влияние

Размер индекса

Количество ключей индекса совпадает с количеством кортежей в наборе данных. Для индекса TREE, если ключей больше, время поиска будет больше, хотя, конечно, эта зависимость не линейная. Для индекса HASH, если ключей больше, используется больше RAM, но количество низкоуровневых шагов, как правило, остается постоянным.

Тип индекса

Как правило, индекс HASH работает быстрее, чем индекс TREE, если количество кортежей в спейсе больше одного.

Количество затронутых индексов

Обычно для получения одного кортежа затрагивается только один индекс. Но для обновления кортежа требуется N обращений, если в спейсе есть N разных индексов.
Примечание относительно движка хранения: Vinyl избегает таких обращений, если поля вторичного индекса не изменяются при обновлении. Поэтому этот фактор сложности применим только к memtx, так как он всегда создает копию всего кортежа при каждом обновлении.

Количество затронутых кортежей

Некоторые запросы, например SELECT, могут получать несколько кортежей. Этот фактор обычно менее важен, чем остальные.

Настройки WAL

Важной настройкой для журнала предзаписи является wal.mode. Если настройка приводит к отсутствию записи или отложенной записи, этот фактор неважен. Если настройка приводит к тому, что каждый запрос на изменение данных ожидает завершения записи на медленном устройстве, этот фактор важнее всех остальных.