node.jscouchdbcloudantdatabase-tuning

Speeding up my cloudant query


I was wondering whether someone could provide some advice on my cloudant query below. It is now taking upwards of 20 seconds to execute against a DB of 50,000 documents - I suspect I could be getting better speed than this.

The purpose of the query is to find all of my documents with the attribute "searchCode" equalling a specific value plus a further list of specific IDs.

Both searchCode and _id are indexed - any ideas why my query would be taking so long / what I could do to speed it up?

mydb.find({selector: {"$or":[{"searchCode": searchCode},{"_id":{"$in":idList}}]}}, function (err, result) {
   if(!err){
      fulfill(result.docs);
   }
   else{
      console.error(err);
   }
});

Thanks, James


Solution

  • You could try doing separate calls for the queries

    The first can be achieved with a find call and a query like so:

    { selector: {"searchCode": searchCode} }
    

    The second can be achieved by hitting the databases's _all_docs endpoint, passing in the list of ids as a keys parameter e.g.

    GET /db/_all_docs?keys=["a","b","c"]
    

    You might find that running both requests in parallel and merging the results gives you better performance.