Rethinkdb 为什么要重新思考DB';s的计数操作这么慢?
我正在尝试为RejectionDB中的一些查询测试任务。我真的没有得到一个问题的很好的答案为什么数据库的Rethinkdb 为什么要重新思考DB';s的计数操作这么慢?,rethinkdb,reql,Rethinkdb,Reql,我正在尝试为RejectionDB中的一些查询测试任务。我真的没有得到一个问题的很好的答案为什么数据库的count()操作这么慢? 我有一个2GB数据的查询: r.db("2GB").table("table").between(40, r.maxval, {index:"price"}) 查询在5毫秒内执行,但有一次我想计算以下项目的数量 r.db("2GB").table("table").between(40, r.maxval, {index:"price"}).count() 这花
count()
操作这么慢?
我有一个2GB数据的查询:
r.db("2GB").table("table").between(40, r.maxval, {index:"price"})
查询在5毫秒内执行,但有一次我想计算以下项目的数量
r.db("2GB").table("table").between(40, r.maxval, {index:"price"}).count()
这花了6秒多的时间
每个使用计数操作的查询都非常慢。我见过很多,但找不到确切的原因
更新:
它不仅仅是
between()
,还有所有其他类似的filter
。count()
非常慢当你调用between
时,你会得到一个光标,当你在上面迭代时,它会缓慢地从磁盘加载数据。因此,返回光标所需的时间量是读取第一批数据所需的时间量,而不是读取所有数据所需的时间量<代码>计数,另一方面,在返回之前必须查看整个表,因此所需时间与表的大小成比例。谢谢,问题已更新。这意味着每件事都作为游标发送,然后使用count?我以为所有的查询都是在服务器上执行的……所有的操作都是在服务器上执行的,但是大多数流操作(包括之间的和过滤器)都是惰性的。当您键入r.table('test').FOO().run(…)
其中FOO
是一个延迟操作时,run
会在第一批数据可用时立即返回;它不会一次从磁盘加载整个表。当您在光标上迭代时,它将加载其余的数据,这样它就不会一次在内存中保留太多数据。因此,您将一个加载少量数据后立即返回的查询与一个加载表中所有数据后才返回的查询进行比较。谢谢@mlucy,现在我对我一年半以来一直在问的问题完全满意!!!