为什么RethinkDB很慢?

时间:2016-07-06 15:45:15

标签: go rethinkdb

我开始使用RethinkDB,我之前从未使用过它。我在Gorethink之后与tutorial一起尝试。

总结本教程,有两个程序:

第一个无限更新条目。

for {
    var scoreentry ScoreEntry
    pl := rand.Intn(1000)
    sc := rand.Intn(6) - 2
    res, err := r.Table("scores").Get(strconv.Itoa(pl)).Run(session)
    if err != nil {
        log.Fatal(err)
    }

    err = res.One(&scoreentry)
    scoreentry.Score = scoreentry.Score + sc
    _, err = r.Table("scores").Update(scoreentry).RunWrite(session)
}

第二个,接收此更改并记录它们。

res, err := r.Table("scores").Changes().Run(session)

var value interface{}

if err != nil {
    log.Fatalln(err)
}
for res.Next(&value) {
    fmt.Println(value)
}

在RethinkDB显示的统计数据中,我可以看到每秒有1.5K的读写操作。但是在第二个程序的控制台中,我看到每秒大约有1或2个更改。

为什么会这样?我错过了什么吗?

2 个答案:

答案 0 :(得分:4)

此代码:

r.Table("scores").Update(scoreentry).RunWrite(session)

可能不会按照您的想法行事。这会尝试通过将scoreentry合并到表中来更新表中的每个文档。这就是RethinkDB控制台每秒显示如此多的写入数量的原因:每次运行该查询时,都会产生数千次写入。

通常你想要更新ReQL中的文档,如下所示:

r.Table('scores').Get(strconv.Itoa(pl)).Update(func (row Term) interface{} {
  return map[string]interface{}{"Score": row.GetField('Score').Add(sc)};
})

如果你需要在Go代码中进行更新,你可以像这样替换那个文档:

r.Table('scores').Get(strconv.Itoa(pl)).Replace(scoreentry)

答案 1 :(得分:0)

我不确定为什么这么慢,可能是因为默认情况下每个查询都会阻塞,直到写完全刷新为止。我首先会添加一些仪器来查看哪个操作速度太慢。还有几种方法可以改善性能:

  1. 使用Durability

    设置写入的UpdateOpts
    _, err = r.Table("scores").Update(scoreentry, r.UpdateOpts{
        Durability: "soft",
    }).RunWrite(session)
    
  2. 在goroutine中执行每个查询以允许您的代码并行执行多个查询(您可能需要使用goroutines池,但此代码只是一个简化示例)

    for {
        go func() {
            var scoreentry ScoreEntry
            pl := rand.Intn(1000)
            sc := rand.Intn(6) - 2
            res, err := r.Table("scores").Get(strconv.Itoa(pl)).Run(session)
            if err != nil {
                log.Fatal(err)
            }
    
            err = res.One(&scoreentry)
            scoreentry.Score = scoreentry.Score + sc
            _, err = r.Table("scores").Update(scoreentry).RunWrite(session)
        }()
    }