Bất kỳ loại cơ sở dữ liệu nào cũng phải đối mặt với các vấn đề về hiệu suất khi dữ liệu phát triển. Các bước đơn giản như viết lại các truy vấn có vấn đề hoặc phân tích / tối ưu hóa lược đồ cơ sở dữ liệu có thể cải thiện đáng kể hiệu suất của cơ sở dữ liệu. MongoDB cung cấp một số tính năng tuyệt vời giúp quá trình này trở nên rất dễ dàng đối với DBA. Ví dụ:Hồ sơ truy vấn, Mongostat, Mongotop, hỗ trợ ghi nhật ký tốt, v.v.
Hầu hết thời gian, hệ thống cơ sở dữ liệu sẽ quyết định cách một truy vấn sẽ thực thi. Người dùng chỉ cần cung cấp thông tin chi tiết về kết quả mà họ muốn thông qua một ngôn ngữ truy vấn. Trong bài viết này, chúng ta sẽ thảo luận về cách chúng ta có thể sử dụng trình biên dịch truy vấn MongoDB để tìm các truy vấn chậm và tiêu tốn nhiều tài nguyên. MongoDB Profiler là một công cụ tích hợp cung cấp cho bạn thông tin chi tiết thực tế về cấp độ truy vấn. Nó cho phép bạn phân tích tất cả các truy vấn đang được chạy bởi hệ thống cơ sở dữ liệu.
Bật / Định cấu hình Trình biên dịch MongoDB
Nói chung, trình biên dịch lưu trữ tất cả dữ liệu trong bộ sưu tập system.profile có thể được truy vấn giống như bất kỳ bộ sưu tập MongoDB bình thường nào khác. Hồ sơ có 3 cấp độ hồ sơ. Theo mặc định, mức hồ sơ được đặt thành 0 cho bất kỳ cơ sở dữ liệu nào.
Cấp 0 | Profiler sẽ không ghi lại bất kỳ dữ liệu nào |
Cấp độ 1 | Profiler sẽ chỉ ghi lại các hoạt động chậm trên một số ngưỡng |
Cấp 2 | Profiler sẽ ghi lại tất cả các hoạt động |
Bạn có thể chạy các lệnh sau để nhận một số thông tin về trình biên dịch.
-
Để có được mức hồ sơ hiện tại.
Đầu ra:db.getProfilingLevel()
0
-
Để kiểm tra trạng thái hồ sơ hiện tại
Đầu ra:db.getProfilingStatus()
{ "was" : 0, "slowms" : 100 }
-
Để đặt mức cấu hình
Đầu ra:db.setProfilingLevel(1, 40)
{ "was" : 0, "slowms" : 100, "ok" : 1 }
MongoDB sẽ in mức cấu hình cũ và trả về OK, nghĩa là mức cấu hình được đặt thành 1 ngay bây giờ.
Slowms là một giá trị ngưỡng cho trình cấu hình, có nghĩa là trình cấu hình sẽ ghi lại tất cả các truy vấn mất nhiều thời gian hơn giá trị ngưỡng để thực thi.
Hiểu Đầu ra của Hồ sơ
Chạy lệnh này để lấy 1 tài liệu từ bộ sưu tập system.profile.
db.system.profile.find().limit(1).pretty()
Đầu ra:
{
"op" : "query",
"ns" : "mydb.Log",
"query" : {
"find" : "Log",
"filter" : {
"EMP_ID" : "01778"
}
},
"keysExamined" : 0,
"docsExamined" : 90022,
"cursorExhausted" : true,
"keyUpdates" : 0,
"writeConflicts" : 0,
"numYield" : 703,
"locks" : {
"Global" : {
"acquireCount" : {
"r" : NumberLong(1408)
}
},
"Database" : {
"acquireCount" : {
"r" : NumberLong(704)
}
},
"Collection" : {
"acquireCount" : {
"r" : NumberLong(704)
}
}
},
"nreturned" : 60,
"responseLength" : 17676,
"protocol" : "op_command",
"millis" : 40,
"execStats" : {
"stage" : "COLLSCAN",
"filter" : {
"EMP_ID" : {
"$eq" : "01778"
}
},
"nReturned" : 60,
"executionTimeMillisEstimate" : 30,
"works" : 90024,
"advanced" : 60,
"needTime" : 89963,
"needYield" : 0,
"saveState" : 703,
"restoreState" : 703,
"isEOF" : 1,
"invalidates" : 0,
"direction" : "forward",
"docsExamined" : 90022
},
"ts" : ISODate("2018-09-09T07:24:56.487Z"),
"client" : "127.0.0.1",
"allUsers" : [ ],
"user" : ""
}
Đây là một tài liệu từ bộ sưu tập system.profile. Chúng ta có thể thấy rằng nó chứa rất nhiều thông tin hữu ích cho chúng ta. Hãy hiểu một số trường hữu ích từ tài liệu này.
- Trường op lưu trữ kiểu hoạt động.
- Trường Ns lưu trữ cơ sở dữ liệu mục tiêu và tên bộ sưu tập
- Trường truy vấn lưu trữ thông tin về truy vấn và kết quả. Kết quả sẽ bị cắt bớt nếu kích thước tài liệu lớn hơn 50KB
- keyExamined lưu trữ số lượng khoá chỉ mục được DB kiểm tra để thực hiện truy vấn
- docsExamined lưu trữ tổng số tài liệu được DB kiểm tra
- Nreturned lưu trữ số lượng tài liệu được trả về bởi truy vấn
- Mili chứa thời gian thực tính bằng mili giây được truy vấn này thực thi
- Ts lưu trữ dấu thời gian của truy vấn
Chúng ta có thể nhận được nhiều thông tin về cách hệ thống cơ sở dữ liệu thực hiện thao tác truy vấn bằng cách kiểm tra các trường này và sử dụng nó để tối ưu hóa hiệu suất của cơ sở dữ liệu. Ví dụ:nếu giá trị keyExamined lớn hơn giá trị “nreturns” thì nó cho thấy rằng DB đang quét nhiều chỉ mục để nhận được kết quả, điều này không bao giờ là một dấu hiệu tốt. Vì vậy, bạn nên điều chỉnh các chỉ mục cơ sở dữ liệu của mình một cách hợp lý.
Vài người trở thành MongoDB DBA - Đưa MongoDB vào Sản xuất Tìm hiểu về những điều bạn cần biết để triển khai, giám sát, quản lý và mở rộng MongoDBDownload miễn phíTruy vấn hữu ích để phân tích đầu ra của hồ sơ
-
Truy vấn hữu ích nhất là sắp xếp tất cả các tài liệu theo mili để nhận được 10 truy vấn chậm hàng đầu.
db.system.profile.find().sort({millis:-1}).limit(10).pretty();
-
Tìm tất cả các truy vấn mất hơn 30 mili giây để thực thi
db.system.profile.find({millis:{$gt:30}}).pretty()
-
Tìm 10 truy vấn tổng hợp / lệnh chậm nhất hàng đầu
db.system.profile.find({op: {$eq: “command” }}).sort({millis:-1}).limit(10).pretty();
-
Tìm tất cả các thao tác mà một số tài liệu đã được di chuyển
db.system.profile.find({moved:true}).pretty()
-
Tìm các truy vấn đang thực hiện quét lớn trên cơ sở dữ liệu
db.system.profile.find({docsExamined:{$gt:10000}}).pretty()
-
Tìm thời gian tối đa và trung bình được thực hiện bởi từng loại hoạt động bằng cách sử dụng tính năng tổng hợp
db.system.profile.aggregate( { $group : { _id :"$op", count:{$sum:1}, "max_time":{$max:"$millis"}, "avg_time":{$avg:"$millis"} }}).pretty()
-
Tìm thời gian tối đa và trung bình được thực hiện bởi các truy vấn trong mỗi cơ sở dữ liệu bằng cách sử dụng tổng hợp
db.system.profile.aggregate( { $group : { _id :"$ns", count:{$sum:1}, "max_time":{$max:"$millis"}, "avg_time":{$avg:"$millis"} }}.pretty()
Kết luận
MongoDB Profiler là công cụ rất hữu ích để hiểu sâu hơn về cách cơ sở dữ liệu thực hiện bất kỳ truy vấn / lệnh nào. Nếu bạn định sử dụng hồ sơ trong môi trường sản xuất, thì bạn nên thực hiện kiểm tra thích hợp vì nó có thể ảnh hưởng đến thông lượng cơ sở dữ liệu của bạn, đặc biệt là khi bạn đang ghi nhật ký tất cả các truy vấn, tức là mức hồ sơ được đặt thành 2. Một khía cạnh khác của việc sử dụng công cụ này là xác định những gì phương tiện chậm. Bạn phải quyết định rằng tất cả các truy vấn có thể được coi là chậm. Dựa vào đó, bạn có thể đặt ngưỡng tối thiểu để ghi các truy vấn. Điều này sẽ làm giảm tác động của việc sử dụng công cụ này lên hiệu suất DB