If one of the criterion results in an AND query has no elements, then return the empty Set immediately
If one of the criterion results in an AND query has few enough elements, then just do a straight get/fetch on those records for the rest of the query criteria instead of doing a find for other criteria
Break up criteria by AND clauses and recursively attack those
Before running each query, check to see if the index is memory and if so, how large it is. Use that information to query the criterion with the smallest index size (and that is in memory!) first...especially for AND queries