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.