MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

MongoDB - Indeks tidak digunakan saat menyortir dan membatasi kueri jarak jauh

Masalahnya adalah tidak ada indeks Anda yang benar-benar membantu dengan kueri yang diurutkan. Inilah alasan tingginya jumlah objek yang dipindai dan keberadaan SORT_KEY_GENERATOR stage (urutan dalam memori, terbatas hingga 32 MB).

Kueri yang tidak diurutkan, sebaliknya, dapat menggunakan { category: 1, _id: 1 } atau { category: 1, _id: 1, sticky: 1, lastPostAt: 1 } indeks. Perhatikan bahwa sangat valid untuk menggunakan salah satunya, karena salah satunya berisi awalan dari yang lain. Lihat Awalan untuk detail selengkapnya.

MongoDB find() kueri biasanya hanya menggunakan satu indeks, jadi indeks gabungan tunggal harus memenuhi semua parameter kueri Anda. Ini akan mencakup kedua parameter find() dan sort() .

Artikel yang bagus tentang bagaimana indeks Anda harus dibuat tersedia di Mengoptimalkan Indeks Senyawa MongoDB. Mari kita ambil poin utama artikel, di mana urutan indeks gabungan harus equality --> sort --> range :

"Bentuk" kueri Anda adalah:

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

Kami melihat bahwa:

  • category:... adalah kesetaraan
  • sticky:-1, lastPostAt:-1, _id:1 adalah mengurutkan
  • _id: {$gt:...} adalah rentang

Jadi indeks gabungan yang Anda butuhkan adalah:

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

Dimana rencana kemenangan dari explain() keluaran kueri Anda dengan indeks di atas menunjukkan:

"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')]"
            ]
          }
        }
      }
    }

Perhatikan bahwa paket pemenang tidak berisi SORT_KEY_GENERATOR panggung. Ini berarti indeks dapat digunakan sepenuhnya untuk menanggapi kueri yang diurutkan.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Kesalahan transaksi PyMongo:Nomor transaksi hanya diperbolehkan pada anggota kumpulan replika atau mongos

  2. Apakah ada opsi untuk membatasi penggunaan memori mongodb?

  3. Isi array bersarang di luwak

  4. Dapatkan nilai sebagai array elemen setelah $lookup

  5. GALAT:Tidak dapat menulis file pid ke /var/run/mongodb/mongod.pid:Tidak ada file atau direktori seperti itu inf fedora 20