MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

MongoDB - Chỉ mục không được sử dụng khi sắp xếp và giới hạn trên truy vấn phạm vi

Vấn đề là không có chỉ mục nào của bạn thực sự giúp được truy vấn được sắp xếp. Đây là lý do giải thích cho số lượng đối tượng được quét cao và sự hiện diện của SORT_KEY_GENERATOR giai đoạn (sắp xếp trong bộ nhớ, giới hạn ở 32MB).

Mặt khác, truy vấn không được sắp xếp có thể sử dụng { category: 1, _id: 1 } hoặc { category: 1, _id: 1, sticky: 1, lastPostAt: 1 } các chỉ mục. Lưu ý rằng hoàn toàn hợp lệ khi sử dụng một trong hai vì một trong hai chứa tiền tố của những thứ còn lại. Xem Tiền tố để biết thêm chi tiết.

MongoDB find() các truy vấn thường chỉ sử dụng một chỉ mục, vì vậy một chỉ mục kết hợp duy nhất sẽ phục vụ cho tất cả các tham số của truy vấn của bạn. Điều này sẽ bao gồm cả các tham số của find()sort() .

Bản ghi tốt về cách tạo chỉ mục của bạn có sẵn trong Tối ưu hóa chỉ mục tổng hợp MongoDB. Chúng ta hãy đi vào điểm chính của bài viết, trong đó thứ tự chỉ mục ghép phải là bình đẳng -> sắp xếp -> phạm vi :

Truy vấn "hình dạng" của bạn là:

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

Chúng tôi thấy rằng:

  • category:... bình đẳng
  • sticky:-1, lastPostAt:-1, _id:1 sắp xếp
  • _id: {$gt:...} phạm vi

Vì vậy, chỉ số kết hợp bạn cần là:

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

Trường hợp kế hoạch chiến thắng của explain() kết quả truy vấn của bạn với chỉ mục trên cho thấy:

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

Lưu ý rằng gói chiến thắng không chứa SORT_KEY_GENERATOR sân khấu. Điều này có nghĩa là chỉ mục có thể được sử dụng đầy đủ để trả lời truy vấn được sắp xếp.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cách truy vấn mongodb với DBRef

  2. MongoDB elemmatch nhiều phần tử trong mảng

  3. Cách cài đặt MongoDB

  4. Kiến thức cơ bản về nhân rộng chuỗi MongoDB

  5. Nhà điều hành đường ống tổng hợp MongoDB $ gt