SQL
8 bài viết
Nền tảng của mọi việc tối ưu: cách trình tối ưu (planner) chọn kế hoạch, đọc EXPLAIN / EXPLAIN ANALYZE, ý nghĩa các node (Seq Scan, Index Scan, Nested Loop, Hash Join, Sort), cost vs actual, và vai trò của thống kê (ANALYZE).
Chỉ mục hoạt động ra sao và dùng đúng cách: B-tree, chỉ mục nhiều cột (thứ tự cột quan trọng), covering/INCLUDE cho index-only scan, partial index, expression index, GIN/GiST cho JSON/full-text, và cái giá của chỉ mục khi ghi.
Kỹ thuật viết lại truy vấn để planner dùng được index và giảm dữ liệu quét: predicate sargable, tránh hàm trên cột, EXISTS vs IN, join vs subquery, phân trang keyset thay OFFSET, tránh SELECT *, và diệt N+1.
Nhìn vào đâu để biết CSDL đang 'ốm': pg_stat_statements tìm truy vấn tốn nhất, pg_stat_activity xem phiên đang chạy, wait events, khóa & deadlock (pg_locks), idle-in-transaction, cache hit ratio, và bloat bảng/chỉ mục.
Công việc DBA giữ CSDL khoẻ: MVCC & VACUUM/autovacuum chống bloat, ANALYZE cập nhật thống kê, reindex, các tham số bộ nhớ then chốt (shared_buffers, work_mem, effective_cache_size), connection pooling (PgBouncer), checkpoint/WAL và backup/PITR.
Nhân bản dữ liệu để chịu tải và chịu lỗi: streaming replication dựa trên WAL (physical) vs logical replication (publication/subscription), đồng bộ vs bất đồng bộ, replication lag, và các mô hình HA/failover (Patroni, replication slot, quorum).
Mở rộng khả năng đọc bằng cách dồn ghi về primary và phân tán đọc sang các replica: cách định tuyến (tầng ứng dụng vs proxy như PgBouncer/HAProxy/Pgpool), xử lý replication lag & read-your-writes, và khi nào buộc đọc từ primary.
Khi một máy không đủ: table partitioning (range/list/hash) và partition pruning để quản lý bảng khổng lồ, sharding để scale ghi, so sánh scale-up vs scale-out, và cách ghép replica + partition + sharding thành kiến trúc dữ liệu chịu tải.