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

Posted

技术标签:

【中文标题】提高 rethinkdb 中大量记录的查询性能【英文标题】:Improve query performance for large number of records in rethinkdb 【发布时间】:2016-04-13 05:36:49 【问题描述】:

我有一个包含 1.5 亿条记录的 rethinkdb 表,其中包含无模式 JSON 数据。我正在查询 JSON 中的嵌套字段,例如“门号”。以下 JSON 中的字段。

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

当我对包含 100 万条记录的表运行相同的查询时,查询在 680 毫秒内返回,但是对于 1.5 亿条记录,查询根本不返回。从 web 控制台,它运行了一段时间,然后给出了一个错误:Query terminated by an unknown cause。在我的 Java 应用程序中,查询似乎永远运行。

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

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

【问题讨论】:

嗨,Kapil,您能否提供更多有关您正在执行的确切查询以及您在表上创建的任何索引的信息? 我正在运行的查询是 r.db('dbName').table('tableName').filter(r.row('Address')('Gate No.').eq (7)),只有一条记录需要返回。该表包含 1.5 亿条记录(4 个分片,每个约 37 百万条记录)。我没有使用索引,尽管构建索引本身的查询从 Web 控制台超时。此外,JSON 文件是无模式的,所以我认为索引不起作用? 过滤器根本不使用任何索引。您需要将 getAll 与 Adress.'Gate No.' 上的索引一起使用。见rethinkdb.com/api/javascript/get_all 嘿卡皮尔!你有机会看看我的回答吗? 是的,谢谢@dalanmiller。看起来建立索引是唯一的出路!我将为 Java 驱动程序创建一个问题 :-) 【参考方案1】:

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

首先,您绝对应该建立一个索引。您说您的数据是无模式的,但我假设所有或大部分条目都有 AddressGate No 字段?如果是这种情况,那么您将创建一个像这样的索引(在数据浏览器中或将此查询转换为 Java):

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

如果不创建索引,您每次搜索此文档时都会自动进行表扫描。您通常希望对经常执行的查询进行索引。如果您经常通过Gate No. 搜索Addresses,这将有所帮助。

现在您使用.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。

【讨论】:

以上是关于提高 rethinkdb 中大量记录的查询性能的主要内容,如果未能解决你的问题,请参考以下文章

RethinkDB 能否有效处理大量稀疏性?

具有大量记录的表的分区视图和性能

如何提高 ADO.NET 中大量 INSERT 的速度?

java中大量数据如何提高性能?

JAVA进阶:提高SQL性能的几种方法

在 Flutter 中使用大量图像(缩略图)提高滚动性能