Chương này giới thiệu về phân tích hiệu suất truy vấn MongoDB, tương tự như câu lệnh explain của SQL, MongoDB cũng hỗ trợ explain để phân tích hiệu suất các câu lệnh truy vấn.

Cách Sử Dụng Cơ Bản

Bằng cách gọi hàm explain, bạn có thể nhận được kết quả phân tích

// Kết quả phân tích của phương thức find
db.collection.find({}).explain();

// Kết quả phân tích của phương thức aggregate
db.collection.explain().aggregate([]);

explain có ba chế độ:

  • queryPlanner (mặc định)
  • executionStats
  • allPlansExecution

Giải thích:

  • Sử dụng queryPlanner chỉ liệt kê tất cả các kế hoạch thực hiện có thể, không thực thi câu lệnh thực tế, và hiển thị kế hoạch winningPlan đã chiến thắng.
  • Sử dụng executionStats chỉ thực thi kế hoạch winningPlan và xuất kết quả.
  • Sử dụng allPlansExecution thực thi tất cả các kế hoạch và xuất kết quả.

Sử dụng các chế độ khác nhau

// Chế độ `executionStats`, đơn giản là truyển tham số vào hàm explain
db.collection.find({}).explain('executionStats');

// Chế độ `allPlansExecution`
db.collection.find({}).explain('allPlansExecution');

Giải Thích Nội Dung của explain

Nội Dung của queryPlanner

Nội dung sau đây là nội dung mặc định được trả về bởi explain, bỏ qua thông tin không quan trọng

{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "test.orders",
		"indexFilterSet" : false, // Thông số chính, liệu có sử dụng bộ lọc chỉ mục hay không
		"winningPlan" : {
			"stage" : "COLLSCAN",  // Thông số chính, tên giai đoạn. Mỗi giai đoạn có thông tin cụ thể riêng, VD: COLLSCAN đại diện cho việc quét toàn bộ nội dung của bảng
			"direction" : "forward"
		},
		"rejectedPlans" : [ ]
	}
	...
}

Các loại giai đoạn giai đoạn như sau:

  • COLLSCAN: Quét đầy đủ bảng
  • IXSCAN: Quét chỉ mục
  • FETCH: Trả về tài liệu cụ thể dựa trên chỉ mục
  • SHARD_MERGE: Hợp nhất dữ liệu được trả về bởi mỗi shard
  • SORT: Cho biết sắp xếp trong bộ nhớ
  • LIMIT: Giới hạn số lần trả về
  • SKIP: Sử dụng để bỏ qua
  • IDHACK: Truy vấn cho _id
  • SHARDING_FILTER: Truy vấn dữ liệu sharded thông qua mongos
  • COUNT: Các hoạt động đếm sử dụng db.coll.explain().count() hoặc tương tự
  • COUNTSCAN: Giai đoạn trả về khi đếm không sử dụng một chỉ mục cho việc đếm
  • COUNT_SCAN: Giai đoạn trả về khi đếm sử dụng một chỉ mục cho việc đếm
  • SUBPLA: Giai đoạn trả về cho các truy vấn $or không sử dụng chỉ mục
  • TEXT: Giai đoạn trả về khi truy vấn sử dụng chỉ mục văn bản đầy đủ
  • PROJECTION: Giai đoạn trả về để giới hạn các trường trả về

Nội Dung của executionStats

Nội dung sau đây là nội dung trả về trong chế độ executionStats, bỏ qua thông tin không quan trọng

{
	"executionStats" : {
		"executionSuccess" : true,
		"nReturned" : 5,  // Số tài liệu trả về
		"executionTimeMillis" : 0, // Thời gian thực thi
		"totalKeysExamined" : 0, // Số lần quét chỉ mục
		"totalDocsExamined" : 5, // Tổng số tài liệu quét
		"executionStages" : {
			"stage" : "COLLS CAN", // Loại giai đoạn, COLLSCAN đồng nghĩa với quét toàn bộ bảng
			"nReturned" : 5,
			"executionTimeMillisEstimate" : 0,
			"works" : 7,
			"advanced" : 5,
			"needTime" : 1,
			"needYield" : 0,
			"saveState" : 0,
			"restoreState" : 0,
			"isEOF" : 1,
			"direction" : "forward",
			"docsExamined" : 5
		}
	}
}

Ý Tưởng Tối Ưu Hóa Truy Vấn

  • Sử dụng chỉ mục càng nhiều càng tốt
  • Số lượng tài liệu quét càng ít càng tốt