sql >> Database >  >> NoSQL >> MongoDB

MongoDB - Index wordt niet gebruikt bij het sorteren en beperken van zoekopdrachten met een bereik

Het probleem is dat geen van uw indexen daadwerkelijk helpt bij de gesorteerde query. Dit is de reden voor het hoge aantal gescande objecten en de aanwezigheid van SORT_KEY_GENERATOR fase (in-memory sort, beperkt tot 32 MB).

De niet-gesorteerde zoekopdracht kan daarentegen de { category: 1, _id: 1 } gebruiken of { category: 1, _id: 1, sticky: 1, lastPostAt: 1 } indexen. Merk op dat het perfect geldig is om een ​​van beide te gebruiken, aangezien een het voorvoegsel . bevat van het andere. Zie Voorvoegsels voor meer details.

MongoDB find() query's gebruiken doorgaans slechts één index, dus een enkele samengestelde index moet alle parameters van uw query omvatten. Dit omvat zowel de parameters van find() en sort() .

Een goede beschrijving van hoe uw index moet worden gemaakt, is beschikbaar in Samengestelde indexen van MongoDB optimaliseren. Laten we het hoofdpunt van het artikel nemen, waar de samengestelde indexvolgorde equality --> sort --> range moet zijn :

Uw zoekopdracht "vorm" is:

db.collection.find({category:..., _id: {$gt:...}})
             .sort({sticky:-1, lastPostAt:-1, _id:1})
             .limit(25)

We zien dat:

  • category:... is gelijkheid
  • sticky:-1, lastPostAt:-1, _id:1 is sorteer
  • _id: {$gt:...} is bereik

Dus de samengestelde index die je nodig hebt is:

{category:1, sticky:-1, lastPostAt:-1, _id:1}

Waar het winnende plan van de explain() uitvoer van uw zoekopdracht met de bovenstaande index toont:

"winningPlan": {
      "stage": "LIMIT",
      "limitAmount": 25,
      "inputStage": {
        "stage": "FETCH",
        "inputStage": {
          "stage": "IXSCAN",
          "keyPattern": {
            "category": 1,
            "sticky": -1,
            "lastPostAt": -1,
            "_id": 1
          },
          "indexName": "category_1_sticky_-1_lastPostAt_-1__id_1",
          "isMultiKey": false,
          "multiKeyPaths": {
            "category": [ ],
            "sticky": [ ],
            "lastPostAt": [ ],
            "_id": [ ]
          },
          "isUnique": false,
          "isSparse": false,
          "isPartial": false,
          "indexVersion": 2,
          "direction": "forward",
          "indexBounds": {
            "category": [
              "[ObjectId('5a779b31f4fa724121265142'), ObjectId('5a779b31f4fa724121265142')]"
            ],
            "sticky": [
              "[MaxKey, MinKey]"
            ],
            "lastPostAt": [
              "[MaxKey, MinKey]"
            ],
            "_id": [
              "(ObjectId('5a779b5cf4fa724121269be8'), ObjectId('ffffffffffffffffffffffff')]"
            ]
          }
        }
      }
    }

Merk op dat het winnende plan geen SORT_KEY_GENERATOR . bevat fase. Dit betekent dat de index volledig kan worden gebruikt om op de gesorteerde vraag te reageren.



  1. Het gegevenstype van een kolom in SQL controleren?

  2. MongoDB $acosh

  3. MongoDB C#-stuurprogramma - Negeer velden bij binding

  4. MongoDB - Een document maken