我一直使用关系数据库,最近决定将性能关键型服务从 SQL Server 迁移到 Tarantool,希望利用快速内存搜索和处理的优势。我在规划迁移时有几个问题。
我有一个包含大约一百万条记录的表,其中包含定价信息,这意味着我主要处理数字和 uuid。首先,我需要运行包含多个条件的选择来获取数据的子集,例如
SELECT * FROM rates WHERE SupplierId = @SupplierId AND ProductId = @ProductId AND (LocalDistributionZoneId = @LocalDistributionZoneId OR LocalDistributionZoneId IS NULL)
Run Code Online (Sandbox Code Playgroud)
Q1:在Lua中运行这样的查询的策略是什么?我是否为谓词中的每个字段创建一个索引,或者可以使用一个辅助复合索引?
Q2:在 SQL (box.sql.execute) 中运行这样的查询会比在纯 Lua 中更方便吗?它会比在纯 Lua 中运行相同的查询慢很多吗?
Q3:如果我使用 SQL,是否可以检查执行计划以确保我运行的查询确实使用了我在空间中定义的索引?
好的,在获得第一个查询的结果后,我需要分析数据,然后根据分析结果,对第一个查询返回的数据集再运行一个查询。
Q4:Tarantool 可以帮助我处理中间数据集吗?更具体地说,我可以以某种方式利用空间中创建的索引对元组的中间子集运行更多查询吗?或者,我需要实施替代策略,例如将 intrim 结果重新添加到具有预定义索引的临时空间,然后进行另一个选择,或者自己实施进一步搜索?
谢谢你!
我做了自动增量索引:
box.space.metric:create_index('primary', {
parts = {{'id', 'unsigned'}},
sequence = true,
})
Run Code Online (Sandbox Code Playgroud)
然后我尝试在id字段中传递 nil :
metric.id = nil
Run Code Online (Sandbox Code Playgroud)
当我尝试插入这个值时,我发现错误:
Tuple field 1 type does not match one required by operation: expected unsigned
Run Code Online (Sandbox Code Playgroud)
我必须为自动增量字段传递什么值?
第二个问题。如果我使用 tarantool-cluster 的实例很少(例如基于墨盒应用程序),是否证明使用自动增量索引?会不会出现不同实例有重复键的情况?
如何在tarantool cartridge不重新启动应用程序的情况下执行热重载代码?
我想在 Tarantool 空间上执行选择,使用过滤和限制结果,就像我可以使用简单的 SQL 查询(例如“ SELECT * FROM users WHERE age > 33 LIMIT 1”)一样。我怎样才能做到这一点?
当我为应用程序使用 docker pack 时,我应该如何配置网络地址?
我正在阅读有关 Tarantool 的这篇文章,他们似乎说 AOF 和 WAL 日志的工作方式不同。
Tarantool:除了快照之外,它还有一个完整的 WAL(预写日志)。因此,它可以在每次开箱即用的交易后确保数据持久性。Redis:事实上,它只有快照。从技术上讲,您有 AOF(仅附加文件,所有操作都在其中写入),但它需要对其进行手动控制,包括重新启动后的手动恢复。简单地说,使用 Redis,您需要时不时地手动挂起服务器,制作快照并存档 AOF。
有人可以更清楚地解释两种策略之间的不同之处以及每种策略如何在高层次上工作。
我一直认为 Redis AOF 与 SQL 数据库事务日志的工作方式相同,例如在 Postgresql 中实现,但我可能错了。
我想使用Tarantool来存储数据。如何使用TTL和简单逻辑(无空格)存储数据?
像这样:
box:setx(key, value, ttl);
box:get(key)
Run Code Online (Sandbox Code Playgroud) 现在的挑战是:有 2 个函数。并且有一个用户只能执行其中之一。问题是怎么做?如果你只是写: box.schema.user.grant ('user', 'execute', 'function', 'dima', nil, {if_not_exists = true}) 那么用户 'user' 根本无法连接。将显示一条错误消息:用户“user”拒绝执行对 Universe“的访问”。如何正确提供访问权限?
box.once("schema", function()
box.schema.user.create('superuser', {password = '11111111'})
box.schema.user.create('user', {password = '11111111'})
box.schema.user.grant('superuser', 'read,write,execute','universe', nil, {if_not_exists = true})
box.schema.user.grant('user','execute','function','dima',nil, {if_not_exists = true})
end)
function reload(proc)
package.loaded[proc]=nil return require(proc)
end
ws = reload('project/init')
Run Code Online (Sandbox Code Playgroud)
功能点:
local obj={}
function obj.open()
return 'dima'
end
return obj
Run Code Online (Sandbox Code Playgroud)
功能 dima2:
local obj={}
function obj.open()
return 'dima2'
end
return obj
Run Code Online (Sandbox Code Playgroud)
初始化.lua:
obj = {}
collectgarbage('collect')
net = require('net.box')
fiber = require('fiber')
uuid = …Run Code Online (Sandbox Code Playgroud)