sql >> Databáze >  >> NoSQL >> MongoDB

mongodb indexová strategie pro rozsahový dotaz s různými poli

Také přidejte trochu více k baloo odpověď uživatele.

U časového razítka vs. dlouhého vydání. Obecně server MongoDB nevidí rozdíl. Délka kódování BSON je stejná (64 bitů). Na straně klienta můžete vidět rozdílný výkon v závislosti na kódování ovladače. Například na straně Java a pomocí ovladače 10gen je časové razítko vykresleno jako Date to je mnohem těžší než Long . Existují ovladače které se snaží vyhnout této režii.

Dalším problémem je, že zaznamenáte zlepšení výkonu, pokud zavřete rozsah pro první pole indexu. Pokud tedy použijete index navržený baloo :

db.collection.ensureIndex({start: 1, final: 1})

Dotaz bude fungovat (potenciálně mnohem) lépe, pokud dotaz zní:

db.collection.find({start:{$gt:DateTime(...),$lt:DateTime(...)}, 
                    final:{$lt:DateTime(...)}})

Koncepčně, pokud si indexy představujete jako strom, uzavřený rozsah omezuje obě strany stromu namísto pouze jedné strany. Bez uzavřeného rozsahu musí server "kontrolovat" všechny položky pomocí start větší než poskytnuté časové razítko, protože nezná vztah mezi start a final .

Můžete dokonce zjistit, že výkon dotazu není o nic lepší při použití indexu jednoho pole, jako je:

db.collection.ensureIndex({start: 1})

Většina úspor pochází z prořezávání prvního pole. Případ, kdy tomu tak nebude, je případ, kdy je dotaz pokryt indexem nebo může být z indexu odvozeno řazení/třídění výsledků.

HTH – Rob.



  1. Geoprostorový dotaz MongoDB s $not

  2. rozdíl mezi agregátem ($match) a nálezem v MongoDB?

  3. Je možné zploštit dotaz na výsledek MongoDB?

  4. Monitorování výkonu a zdraví ClusterControl