Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Phân tích query plan MongoDB với explain() cho db.collection.find()

Để xem thông tin kế hoạch thực thi truy vấn (query plan), sử dụng phương thức explain() sau find().

Tạo collection và index

> db.demo637.ensureIndex({ClientName: 1});
> db.demo637.insert({ClientName:"John"});
> db.demo637.insert({ClientName:"Bob"});
> db.demo637.insert({ClientName:"Johnson"});

Hiển thị dữ liệu

> db.demo637.find();

Kết quả: 3 document với ClientName: John, Bob, Johnson

Case 1: Regex không có anchor (/john/)

> db.demo637.find({ClientName: /john/}).explain();

Kết quả explain (rút gọn):

{
  "queryPlanner": {
    "winningPlan": {
      "stage": "FETCH",
      "inputStage": {
        "stage": "IXSCAN",
        "filter": { "ClientName": { "$regex": "john" } },
        "keyPattern": { "ClientName": 1 },
        "indexName": "ClientName_1",
        "indexBounds": {
          "ClientName": [ "[\"\", {})", "[/john/, /john/]" ]
        }
      }
    }
  }
}

Phân tích: Dùng index (IXSCAN) nhưng có **filter** vì regex không có anchor đầu (^)

Case 2: Regex có anchor đầu (/^john/)

> db.demo637.find({ClientName: /^john/}).explain();

Kết quả explain (rút gọn):

{
  "queryPlanner": {
    "winningPlan": {
      "stage": "FETCH",
      "inputStage": {
        "stage": "IXSCAN",
        "keyPattern": { "ClientName": 1 },
        "indexName": "ClientName_1",
        "indexBounds": {
          "ClientName": [ "[\"john\", \"joho\")", "[/^john/, /^john/]" ]
        }
      }
    }
  }
}

Phân tích: Dùng index (IXSCAN) **không có filter** - index bounds chính xác ["john", "joho") nhờ anchor ^

So sánh hiệu năng

RegexSử dụng IndexFilterHiệu năng
/john/Có (IXSCAN)CóChậm hơn - quét range rộng
/^john/Có (IXSCAN)KhôngNhanh - seek chính xác

Kết luận: Luôn dùng anchor ^ cho regex prefix search để tận dụng index tối đa. explain() giúp xác nhận index có được dùng hiệu quả không.