Đầu ra EXPLAIN ANALYZE trông đáng sợ cho đến khi bạn biết ba con số thực sự quan trọng. Đây là thứ tự tôi đọc chúng, và các mẫu chỉ ra các lỗi cụ thể.
Ba con số thực sự quan trọng
1. Tổng thời gian thực thi (Total Execution Time)
Total runtime: 1234.567 ms
Đây là chỉ số quan trọng nhất. Nếu truy vấn chậm, nó sẽ cho bạn biết ở đây.
2. Số hàng thực tế vs số hàng ước tính (Actual vs Estimated Rows)
Seq Scan on users (cost=0.00..123.45 rows=1000 width=32) (actual time=1.234..567.890 rows=50000 loops=1)
Sự khác biệt lớn cho thấy trình lập kế hoạch đã đưa ra giả định sai.
3. Tỷ lệ trúng bộ đệm (Buffer Hit Ratio)
Buffers: shared hit=1000 read=50
Tỷ lệ trúng cao = sử dụng bộ đệm tốt, tỷ lệ trúng thấp = vấn đề I/O đĩa.
Thứ tự đọc
- Bắt đầu từ dưới - tổng thời gian thực thi
- Làm việc lên trên - tìm nút có chi phí cao nhất
- Kiểm tra ước tính hàng - thực tế vs ước tính
- Xem thống kê bộ đệm - mẫu I/O
Mẫu vấn đề phổ biến
Quét tuần tự khi nên quét chỉ mục
Seq Scan on large_table (cost=1000.00..2000.00 rows=100000 width=32)
Giải pháp: Thêm chỉ mục phù hợp
Vòng lồng khi nên kết nối băm
Nested Loop (cost=1000.00..100000.00 rows=1000 width=64)
-> Seq Scan on users
-> Index Scan on orders
Giải pháp: Tăng work_mem hoặc viết lại truy vấn
Quá nhiều bộ đệm không trúng
Buffers: shared hit=10 read=1000
Giải pháp: Tăng shared_buffers hoặc cải thiện truy vấn
Sắp xếp tràn ra đĩa
Sort Method: external merge Disk: 16384kB
Giải pháp: Tăng work_mem
Ứng dụng thực tế
Những hiểu biết này giúp tôi xác định và sửa chữa:
- Chỉ mục bị thiếu
- Thứ tự kết nối không hiệu quả
- Vấn đề thiếu bộ nhớ
- Bộ đệm không trúng
Hãy nhớ: EXPLAIN ANALYZE là trình gỡ lỗi hiệu suất truy vấn của bạn. Học cách đọc nó sẽ tiết kiệm cho bạn vô số giờ đoán mò.