2015-07-11 64 views
4

我正在嘗試對RethinkDB中的某些查詢進行基準測試任務。我真的沒有得到很好的回答爲什麼RethinkDB的count()操作太慢?爲什麼RethinkDB的計數操作很慢?

我有一個查詢與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秒 每個使用計數操作的查詢都非常慢。我見過很多issues in github,但無法得到確切的原因。

更新: 它不只是between()但所有其他類似filter ....的count()是可怕的慢

回答

5

當你調用between你回來的光標,這懶洋洋地加載數據從磁盤你迭代超過它。因此,返回光標所需的時間量是讀取第一批數據所需的時間量,而不是全部數據。另一方面,count在返回之前必須查看整個表格,因此它需要與表格大小成比例的時間。

+0

謝謝,問題已更新。 這意味着每件事都作爲遊標發送,然後使用計數?我認爲所有的查詢都是在服務器上執行的...... –

+1

一切都在服務器上執行,但是大多數流操作(包括''和'filter')都是懶惰的。當你輸入r.table('test')。FOO()。run(...)'其中'FOO'是一個惰性操作時,只要第一批數據可用,'run'就會返回;它不會立即將整個表從磁盤加載。當你迭代遊標時,它會加載其餘的數據,這樣它就不會一次保存太多內存。因此,您要比較一個查詢,該查詢在將非常少量的數據加載到查詢之後立即返回,該查詢在您將表中的所有數據加載之前不會返回。 – mlucy

+0

謝謝@mlucy,現在我完全滿意我問了超過一年半的問題! –