Đọc EXPLAIN từ con số 0 tới chẩn đoán plan sai, qua hơn 60 ví dụ trên một database e-commerce giả lập kiểu project laravel-livewire (2 triệu đơn, 5 triệu dòng hàng). Nên đọc theo thứ tự 1 → 5. Mọi plan là output thật trên PostgreSQL 18.4; SQL của Eloquent lấy từ Laravel 12.64.
Đọc từ trong ra ngoài; tính tay cost và rows khớp từng số; loops và số lẻ của PG 18; cùng plan 134 ms → 19 ms theo cache; DELETE có 95% thời gian nằm ngoài cây plan.
Bài 2 · ScanforeignId()->constrained() không tạo index: DELETE 20 đơn mất 10 giây; whereDate, whereYear, JSON, LIKE làm index vô dụng; VACUUM bỏ qua dọn index; skip scan PG 18.
Bài 3 · JoinBatches và "originally"; Memoize 984 hit / 50 miss; NOT IN 10 phút chưa xong so với NOT EXISTS 1,6 giây; LEFT JOIN thành INNER JOIN; ước lệch 120 lần mà Nested Loop vẫn thắng.
Bài 4 · Sort, Limit…Bẫy ORDER BY + LIMIT bỏ qua 1,3 triệu dòng; hai plan cost ngang nhau mà 10 s so với 2,3 s; OFFSET và keyset; withCount; ba dấu hiệu partition pruning.
Bài 5 · Chẩn đoánCREATE STATISTICS, thống kê biểu thức, n_distinct, thống kê cũ sau lô nhập; generic plan lần thứ 6 (Laravel không bị); random_page_cost; JIT; auto_explain; runbook 3 giờ sáng.