如何 运行 在 Tarantool 中进行复杂查询

How to run complex queries in Tarantool

我一直使用关系数据库,最近决定将性能关键服务从 SQL 服务器迁移到 Tarantool,希望利用快速内存​​搜索和处理。在计划迁移时我有几个问题。

我有一个 table,其中包含大约一百万条包含定价信息的记录,这意味着我主要处理数字和 uuid。首先,我需要运行一个包含多个条件的select来获取数据的一个子集,比如

SELECT * FROM rates WHERE SupplierId = @SupplierId AND ProductId = @ProductId AND (LocalDistributionZoneId = @LocalDistributionZoneId OR LocalDistributionZoneId IS NULL)

Q1:运行在Lua中进行这样的查询的策略是什么?我是为谓词中的每个字段创建一个索引,还是可以使用一个二级复合索引?

Q2:在SQL(box.sql.execute)中运行这样的查询会比在纯Lua中更方便吗?它会比 运行 在纯 Lua 中使用相同的查询慢得多吗?

问题 3:如果我使用 SQL,是否可以查看执行计划以确保我 运行 的查询确实使用了我在 space 中定义的索引]?

好的,在我得到第一个查询的结果后,我需要分析数据,然后根据分析结果,运行对第一个查询返回的数据集再进行一次查询。

Q4:Tarantool可以帮我处理中间数据集吗?更具体地说,我可以以某种方式 运行 更多查询利用在 space 中创建的索引的元组中间子集吗?或者,我需要实施替代策略,例如将内部结果重新添加到具有预定义索引的临时 space,然后再执行另一个 select,或者自己实施进一步搜索?

谢谢!

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