0

我正在使用 couchdb 编写 android。我有大约 1000 个文件。每个数据库操作都会调用一个视图,我的视图需要很多时间。有没有办法优化沙发数据库中的视图?如果文档较少,则获取文档的速度很快。

4

3 回答 3

4

视图需要注意的主要事项是 map 和 reduce 值都缓存在视图索引中(有关详细信息,请参见http://horicky.blogspot.co.uk/2008/10/couchdb-implementation.html),视图是只有在您查看它们时才重新构建,并且 CouchDB JavaScript 引擎并不是特别快。

有几个选项可以将所有这些用于实际的性能改进:

  • 接受视图中的陈旧数据,并定期异步重建视图索引。您可以使用 ?stale=ok 查询视图以立即返回当前缓存的视图索引,从上次构建视图开始,然后使用 stale != ok 进行一些其他后台任务查询以实际进行重建。典型的策略是每 X 分钟重建一次视图,或者观察 /db/_changes 在每次 Y 更改后重建视图。取决于您的应用程序。

  • 接受过时的数据,然后总是立即异步重建视图。这使用 ?stale=update_after,我相信它会立即返回一个值,然后在后台重建视图。是执行此操作还是执行上述操作取决于您的用例以及最新值对您的重要性;这最终可能会导致您重建视图远远超过真正需要的程度,从而实际上减慢您的查询速度。不过,这似乎比前一个选项更容易。

  • 将尽可能多的代码推送到地图函数中。这应该会提高快速更改数据库的性能,因为映射值被缓存并且在基础文档更改之前不需要更新,而当大量文档中的一个更改时减少重新计算的需要。我不确定如何在 CouchDB 中精确地调整减少重新计算,即需要重新计算的集合有多大,但它肯定会发生更多的地图重新计算,并且可能更多。

  • 使用内置的 reduce 函数(参见http://wiki.apache.org/couchdb/Built-In_Reduce_Functions)而不是用 JavaScript 重写它们。它们满足了许多标准的 reduce 情况,并且比自己编写等效函数要快得多。

  • 用 Erlang 重写你的 map/reduce。请参阅http://wiki.apache.org/couchdb/EnableErlangViews。这确实需要您学习 Erlang,但应该会占用您大部分视图重建时间。

于 2013-04-19T10:56:13.417 回答
1

每个文档只执行一次视图中的地图功能(加上更新文档的次数)。这发生在您第一次查询视图时。之后不再需要计算 map 函数的结果,因此对视图的查询应该非常快。由于视图已经很有效,因此没有进一步优化它们的通用方法。

临时视图不是这种情况。如果您正在使用这些,请将它们存储在设计文档中以将它们转换为常规视图。

于 2013-04-19T06:07:09.997 回答
0

在 map 函数的文档中发出尽可能少的数据。如果您确实需要整个文档,可以使用include_docs=trueurl 参数访问整个文档

好的

{
  map: function(doc) {
    emit(doc._id, null)
  }
}

坏的

{
  map: function(doc) {
    emit(doc._id, doc)
  }
}
于 2013-04-19T16:48:19.217 回答