提高rethinkdb中大量记录的查询性能

时间:2016-04-13 05:36:49

标签: rethinkdb

我有一个包含150条记录的rethinkdb表,其中包含无架构的JSON数据。我在JSON中查询嵌套字段,例如“门号”' JSON下面的字段。

{ 'Name' : 'XYZ', 'Age' : 22, 'Address' : { 'Gate No.' : 7, 'Society' : 'ABC' } }

当我为包含1mn条记录的表运行相同的查询时,查询在680毫秒内返回,但是有150条记录,查询根本没有返回。从Web控制台运行一段时间,稍后会出错:Query terminated by an unknown cause。从我的Java应用程序,查询似乎永远运行。

我尝试使用4台服务器进行分片,每台服务器保存约3700万份文件,但这似乎并没有改善这种情况。如何让查询运行?

PS。:我的JSON数据完全没有模式,因此索引数据不是一个可行的选择。

1 个答案:

答案 0 :(得分:2)

根据你说的额外信息,我会像这样解决这个问题:

首先你应该做一个索引。您说您的数据是无模式的,但我认为所有或大多数条目都有AddressGate No字段?如果是这种情况,那么您将创建一个类似的索引(在数据资源管理器中或将此查询转换为Java):

r.db("dbName").table("tableName").indexCreate('gate_no', r.row("Address")("Gate No.")

在不创建索引的情况下,每次搜索此文档时,您都会自动执行表扫描。您通常希望为经常执行的查询创建索引。如果您经常按Address搜索Gate No. es,这将有所帮助。

现在,您使用.getAll指定要查找的值,并显式传递您要使用的索引,该索引将返回您要查找的值。 (顺便说一句,它被称为.getAll,因为与主键不同,辅助键可以有多个值)

r.db("dbName").table("tableName").getAll(7, {index: 'gate_no'})

这将在很短的时间内为您提供结果。 (不确定具体情况,但平均为O(n log n),具体取决于索引树的当前余额)。

对于数据资源管理器,它实际上是一个简单探索数据集的工具,并不是为解析数百万个文档而设计的。进行这些类型的测试,我发现放入ipythonnode repl使事情变得更容易并且可以翻译成最终产品。

最后,Java驱动程序不应该表现得那样。你绝对应该在Github上打开一个问题,这样我们才能正确地投入 - https://github.com/rethinkdb/rethinkdb/issues/new