如何在 Tarantool 中运行复杂查询

Ale*_*tin 4 lua tarantool

我一直使用关系数据库,最近决定将性能关键型服务从 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 结果重新添加到具有预定义索引的临时空间,然后进行另一个选择,或者自己实施进一步搜索?

谢谢你!

Kos*_*tja 5

  1. 不。使用SQL,速度更快:它不会为中间执行结果创建垃圾收集对象。
  2. 是的,请使用我们的 SQL 功能。
  3. 使用 EXPLAIN 语句。
  4. 我不知道你所说的“帮助”到底是什么意思。您可以尝试最有效的策略:创建更复杂的查询,将原始查询保存在视图中以在结果查询中使用,创建临时表并使用它。为了提供更多详细信息,让我们看看 Tarantool 选择的执行计划是否足够好,或者您必须手动优化它。