Bỏ qua để đến nội dung
Knowledge Hub

Tình huống: query chậm dần khi bảng lên 30 triệu dòng Trung cấp

Thời gian đọc ước tính: 1 phút

Một endpoint không ai đụng tới suốt 18 tháng, chỉ có bảng lớn dần. Bạn đi từ triệu chứng tới query, từ query tới plan, rồi tới index. Mọi plan trong game đều chạy thật trên PostgreSQL 17 với bảng 30 triệu dòng, chỉ rút gọn cho dễ đọc.

  • Chọn sai thì đọc giải thích rồi Chọn lại. Điểm chỉ tính lựa chọn đầu tiên ở mỗi bước.
  • Trước khi chọn, nhìn kỹ rows, Rows Removed by Filter và Buffers trong plan.
Tình huống

API "Đơn của tôi": 20 ms lúc ra mắt, 4 giây sau 18 tháng

Bạn là backend dev on-call. Bảng orders đã lên 30 triệu dòng và endpoint "Đơn của tôi" chậm dần. Mỗi lựa chọn hiển thị ngay hậu quả trên các chỉ số.

Thời gian TB của query3.800 ms
Thông lượng tối đa4 req/s
Buffer đọc (request tệ nhất)265.600
Chi phí DB800 $/tháng

Bước 1/4 · Cái gì đang chậm?

Lúc ra mắt, màn hình "Đơn của tôi" trả về trong 20 ms. 18 tháng sau, bảng orders có 30 triệu dòng và màn hình này mất khoảng 4 giây. CPU database luôn cao, nhiều endpoint khác cũng chậm theo.

Bạn chưa biết chính xác câu SQL nào là thủ phạm.

orders
30 triệu dòng, 2.7 GB
GET /me/orders
~4 giây
DB
4 vCPU, CPU luôn cao

Bạn làm gì?

Chơi xong, đọc Đọc EXPLAIN và EXPLAIN ANALYZE để nắm quy trình bốn bước đọc một plan lạ.