我正在使用couchdb编写android。我有大约1000份文件。每个数据库操作调用一个视图,我的观点需要花费很多时间。有没有办法优化沙发数据库中的视图?如果文档较少,则提取文档的速度很快。
答案 0 :(得分:4)
要注意的主要注意事项是map和reduce值都缓存在视图索引中(有关详细信息,请参阅http://horicky.blogspot.co.uk/2008/10/couchdb-implementation.html),只有在查看视图时才会重建视图,以及CouchDB JavaScript发动机不是特别快。
有一些选项可以将所有这些用于实际的性能改进:
接受视图中的陈旧数据,并定期异步重建视图索引。您可以使用?stale = ok查询视图,以便从上次构建视图时立即返回当前缓存的视图索引,然后让其他后台任务查询过时!= ok以实际执行重建。对此的典型策略是每隔X分钟重建一次视图,或者在每次Y更改后观察/ db / _changes重建视图。取决于您的申请。
接受陈旧数据,然后始终立即异步重建视图。这使用?stale = update_after,我相信它会立即返回一个值,然后在后台进行视图重建。是否执行此操作或上述操作取决于您的使用案例以及最新值对您的重要程度;这可能最终导致您重建视图远远超过实际需要,从而实际上减慢了查询速度。这似乎比以前的选项更容易。
尽可能多地将代码推送到地图功能中。这应该可以提高快速更改数据库的性能,因为映射值会被缓存,并且在基础文档发生更改之前不需要更新,而只需更新一组文档中的一个更改就需要重新计算。我不确定在CouchDB中如何调整减少重新计算,即需要重新计算的集合有多大,但它肯定会发生更多的地图重新计算,并且可能更多。
使用内置的reduce函数(请参阅http://wiki.apache.org/couchdb/Built-In_Reduce_Functions),而不是在JavaScript中重写它们。这些实现了许多标准的减少情况,并且比自己编写等效函数要快得多。
在Erlang中重写map / reduce。见http://wiki.apache.org/couchdb/EnableErlangViews。这确实需要您学习Erlang,但是应该只占用视图重建时间的大部分。
答案 1 :(得分:1)
视图中的map函数每个文档只执行一次(加上更新文档的次数)。这在第一次查询视图时发生。之后,不再需要计算map函数的结果,因此对视图的查询应该非常快。由于视图已经很有效,因此没有一般方法可以进一步优化它们。
临时视图不是这种情况。如果您使用这些,请将它们存储在设计文档中,以将它们转换为常规视图。
答案 2 :(得分:0)
在地图功能中发布文档中尽可能少的数据。如果您确实需要整个文档,则可以使用include_docs=true
url参数访问整个文档
{
map: function(doc) {
emit(doc._id, null)
}
}
{
map: function(doc) {
emit(doc._id, doc)
}
}