MongoDB - Phân tích truy vấn
Phân tích truy vấn là một khía cạnh rất quan trọng để đo lường mức độ hiệu quả của thiết kế cơ sở dữ liệu và lập chỉ mục. Chúng ta sẽ tìm hiểu về các$explain và $hint truy vấn.
Sử dụng $ giải thích
Các $explaintoán tử cung cấp thông tin về truy vấn, các chỉ mục được sử dụng trong một truy vấn và các thống kê khác. Nó rất hữu ích khi phân tích mức độ tối ưu hóa các chỉ mục của bạn.
Trong chương trước, chúng tôi đã tạo một chỉ mục cho users bộ sưu tập trên các lĩnh vực gender và user_name bằng cách sử dụng truy vấn sau -
>db.users.createIndex({gender:1,user_name:1})
{
"numIndexesBefore" : 2,
"numIndexesAfter" : 2,
"note" : "all indexes already exist",
"ok" : 1
}
Bây giờ chúng tôi sẽ sử dụng $explain trên truy vấn sau -
>db.users.find({gender:"M"},{user_name:1,_id:0}).explain()
Truy vấn giải thích () ở trên trả về kết quả được phân tích sau:
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "mydb.users",
"indexFilterSet" : false,
"parsedQuery" : {
"gender" : {
"$eq" : "M"
}
},
"queryHash" : "B4037D3C",
"planCacheKey" : "DEAAE17C",
"winningPlan" : {
"stage" : "PROJECTION_COVERED",
"transformBy" : {
"user_name" : 1,
"_id" : 0
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"gender" : 1,
"user_name" : 1
},
"indexName" : "gender_1_user_name_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"gender" : [ ],
"user_name" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"gender" : [
"[\"M\", \"M\"]"
],
"user_name" : [
"[MinKey, MaxKey]"
]
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "Krishna",
"port" : 27017,
"version" : "4.2.1",
"gitVersion" : "edf6d45851c0b9ee15548f0f847df141764a317e"
},
"ok" : 1
}
Bây giờ chúng ta sẽ xem xét các trường trong tập kết quả này -
Giá trị thực của indexOnly chỉ ra rằng truy vấn này đã sử dụng lập chỉ mục.
Các cursortrường chỉ định loại con trỏ được sử dụng. Kiểu BTreeCursor chỉ ra rằng một chỉ mục đã được sử dụng và cũng cho biết tên của chỉ mục được sử dụng. BasicCursor chỉ ra rằng quá trình quét toàn bộ đã được thực hiện mà không sử dụng bất kỳ chỉ mục nào.
n cho biết số lượng tài liệu phù hợp được trả lại.
nscannedObjects cho biết tổng số tài liệu được quét.
nscanned cho biết tổng số tài liệu hoặc mục chỉ mục được quét.
Sử dụng $ gợi ý
Các $hinttoán tử buộc trình tối ưu hóa truy vấn sử dụng chỉ mục được chỉ định để chạy truy vấn. Điều này đặc biệt hữu ích khi bạn muốn kiểm tra hiệu suất của một truy vấn với các chỉ mục khác nhau. Ví dụ: truy vấn sau chỉ định chỉ mục trên các trườnggender và user_name được sử dụng cho truy vấn này -
>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1})
{ "user_name" : "tombenzamin" }
Để phân tích truy vấn trên bằng cách sử dụng $ giải thích -
>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1}).explain()
Cho bạn kết quả sau:
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "mydb.users",
"indexFilterSet" : false,
"parsedQuery" : {
"gender" : {
"$eq" : "M"
}
},
"queryHash" : "B4037D3C",
"planCacheKey" : "DEAAE17C",
"winningPlan" : {
"stage" : "PROJECTION_COVERED",
"transformBy" : {
"user_name" : 1,
"_id" : 0
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"gender" : 1,
"user_name" : 1
},
"indexName" : "gender_1_user_name_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"gender" : [ ],
"user_name" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"gender" : [
"[\"M\", \"M\"]"
],
"user_name" : [
"[MinKey, MaxKey]"
]
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "Krishna",
"port" : 27017,
"version" : "4.2.1",
109
"gitVersion" : "edf6d45851c0b9ee15548f0f847df141764a317e"
},
"ok" : 1
}