MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Intersezione dell'indice MongoDB

Bene, in realtà lo fa anche se in questo caso non è così. Per vedere davvero cosa sta succedendo devi guardare il modulo "prolisso" di spiegazione, aggiungendo true :

db.t.find({item:"abc123",qty:{$gt:15}}).explain(true)
{
    "cursor" : "BtreeCursor item_1",
    "isMultiKey" : false,
    "n" : 84,
    "nscannedObjects" : 100,
    "nscanned" : 100,
    "nscannedObjectsAllPlans" : 201,
    "nscannedAllPlans" : 304,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 2,
    "nChunkSkips" : 0,
    "millis" : 2,
    "indexBounds" : {
            "item" : [
                    [
                            "abc123",
                            "abc123"
                    ]
            ]
    },
    "allPlans" : [
            {
                    "cursor" : "BtreeCursor item_1",
                    "isMultiKey" : false,
                    "n" : 84,
                    "nscannedObjects" : 100,
                    "nscanned" : 100,
                    "scanAndOrder" : false,
                    "indexOnly" : false,
                    "nChunkSkips" : 0,
                    "indexBounds" : {
                            "item" : [
                                    [
                                            "abc123",
                                            "abc123"
                                    ]
                            ]
                    }
            },
            {
                    "cursor" : "BtreeCursor qty_1",
                    "isMultiKey" : false,
                    "n" : 0,
                    "nscannedObjects" : 101,
                    "nscanned" : 102,
                    "scanAndOrder" : false,
                    "indexOnly" : false,
                    "nChunkSkips" : 0,
                    "indexBounds" : {
                            "qty" : [
                                    [
                                            15,
                                            Infinity
                                    ]
                            ]
                    }
            },
            {
                    "cursor" : "Complex Plan",
                    "n" : 0,
                    "nscannedObjects" : 0,
                    "nscanned" : 102,
                    "nChunkSkips" : 0
            }
    ],

Taglia corto, ma l'ultima parte è quello che stai cercando. Come spiegato nel manuale, l'aspetto di "Piano complesso" indica che è in uso un incrocio.

            {
                    "cursor" : "Complex Plan",
                    "n" : 0,
                    "nscannedObjects" : 0,
                    "nscanned" : 102,
                    "nChunkSkips" : 0
            }

L'unico caso qui è che mentre viene "esaminato" non viene scelto dall'ottimizzatore in questo caso come la query più "ottimale". Quindi l'ottimizzatore sta dicendo che in effetti il ​​piano che utilizza solo l'indice selezionato è quello che verrà completato nel modo più reattivo.

Quindi, mentre è stato considerato l'"incrocio", non era il "miglior adattamento" ed è stato scelto l'indice singolo.