我正在尝试从我的数据库(拥有超过400,000个文档)请求大量文档。我开始使用_all_docs内置视图。我首先尝试使用此查询:
http://database:port/databasename/_all_docs?limit=100&include_docs=true
没问题。按预期完成。现在提升它:
http://database:port/databasename/_all_docs?limit=1000&include_docs=true
还好。按预期更长,更多数据等。再次加速:
http://database:port/databasename/_all_docs?limit=10000&include_docs=true
请求永远不会完成。 Chrome中的开发工具显示大小= 5.3MB(似乎很重要),无论我使用的限制参数的值超过6500ish,都会发生这种情况。无论我指定6500还是10,000,它总是返回5.3MB下载,并且请求停止。
我也尝试了其他组合,例如“跳过”,似乎限制+跳过必须< 6500或者我得到同样的摊位。
我的环境:Couchdb 1.6.1,Ubuntu 14.04.3 LTS,Azure A1标准
答案 0 :(得分:0)
你必须预热你的查询,只需要投入100K或更多的文档,并期望你从沙发中取出它们不会工作,它只是不会工作。
当您从视图中询问某些项目时(在您的案例中为默认视图),在第一次读取时,CouchDB会注意到该视图的B树尚未存在,因此它继续并构建它在第一次阅读。根据数据库中的文档数量,这可能需要一段时间,从而为数据库带来良好的工作量。
在每次后续读取时,CouchDB将检查自上次写入后文档是否已更改,并将更改的文档丢弃到map和reduce函数。因此,如果您不时只查询某些视图,但两者之间有很多变化,那么下次读取时会有一些延迟。
有两种方法可以处理这种情况 1.预热您的视图 - 运行一个执行读取的cronjob,以确保您的视图具有此视图的B树。 2.在将数据插入couchdb之前,预先为特定查询准备视图。
现在如果您真的想要阅读所有文档,请不要一次阅读所有文档,而应使用跳过限制范围查询。