Операции
Базовые операции с данными, поддерживаемые в 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 разных индексов. |
Количество затронутых кортежей | Некоторые запросы, например SELECT, могут получать несколько кортежей. Этот фактор обычно менее важен, чем остальные. |
Настройки WAL | Важной настройкой для журнала предзаписи является wal.mode. Если настройка приводит к отсутствию записи или отложенной записи, этот фактор неважен. Если настройка приводит к тому, что каждый запрос на изменение данных ожидает завершения записи на медленном устройстве, этот фактор важнее всех остальных. |