Операции
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: обновить или вставить кортеж, снова изменяя поле 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
.
Примечание
Помимо Lua можно использовать коннекторы к Perl, PHP, Python или другому языку программирования. Клиент-серверный протокол открыт и задокументирован. См. БНФ с комментариями.
Во вложенных модулях box.space и Вложенный модуль box.index содержится информация о том, как факторы сложности могут повлиять на использование каждой функции.
Фактор сложности | Эффект |
---|---|
Размер индекса | Количество ключей в индексе равно количеству кортежей в наборе данных. Для TREE-индекса: чем больше ключей, тем больше время поиска, хотя зависимость здесь, конечно же, нелинейная. Для HASH-индекса: чем больше ключей, тем больше нужно оперативной памяти, но количество низкоуровневых шагов остается примерно тем же. |
Index type | Как правило, поиск по HASH-индексу работает быстрее, чем по TREE-индексу, если в спейсе более одного кортежа. |
Количество обращений к индексам | Ordinarily, only one index is accessed to retrieve
one tuple. But to update the tuple, there must be N
accesses if the space has N different indexes.
Note regarding storage engine: Vinyl optimizes away such accesses if secondary index fields are unchanged by the update. So, this complexity factor applies only to memtx, since it always makes a full-tuple copy on every update. |
Количество обращений к кортежам | Некоторые запросы, например SELECT, могут возвращать несколько кортежей. Обычно этот фактор менее важен, чем другие. |
Настройки WAL | Важным параметром для записи в WAL является wal_mode. Если запись в WAL отключена или задана запись с задержкой, но этот фактор не так важен. Если же запись в WAL производится при каждом запросе на изменение данных, то при каждом таком запросе приходится ждать, пока отработает обращение к более медленному диску, и данный фактор становится важнее всех остальных. |