Lập trình Go 22/09/2026 10 phút

Batch insert trong Go: vì sao chèn từng dòng chậm gấp trăm lần

Chèn N dòng bằng N lệnh Exec là N vòng đi-về mạng, mỗi vòng trả giá độ trễ cố định. Nút thắt là SỐ round-trip, không phải tốc độ chèn một dòng. Đo thật trong Go: chèn 2000 dòng từng cái mất 2.6s (2000 round-trip); multi-row INSERT gộp lô 200 chỉ 14ms (10 round-trip) — nhanh 193 lần.

Kiến trúc hệ thống 22/09/2026 5 phút

Instagram sinh ID phân tán: 64 bit gói cả thời gian, shard và thứ tự

Ở quy mô sharded, cần ID duy nhất mà không có điểm sinh trung tâm (nút thắt). Instagram gói vào 64 bit: 41 bit timestamp + 13 bit shard + 10 bit sequence, sinh ngay trong Postgres bằng PL/pgSQL. Bài này dựng THẬT đúng scheme đó: ID tăng theo thời gian, 50.000 ID không trùng, và trích được shard từ chính con số ID.

Kiến trúc hệ thống 22/09/2026 5 phút

Tìm kiếm toàn văn như Elasticsearch: inverted index đánh bại LIKE ~1000 lần

LIKE '%từ%' phải quét từng bản ghi — O(n), không index được. Elasticsearch (và Lucene) dùng inverted index: ánh xạ từ tới danh sách tài liệu chứa nó. Bài này dựng THẬT trong PostgreSQL bằng tsvector + GIN và đo EXPLAIN ANALYZE: cùng kết quả nhưng inverted index nhanh hơn ~1092 lần trên 500.000 tài liệu.

Kiến trúc hệ thống 22/09/2026 6 phút

PgBouncer gộp kết nối: vì sao ngàn kết nối làm sập PostgreSQL, và cách cứu

Mỗi kết nối PostgreSQL là một process riêng tốn RAM, và max_connections có trần cứng — ngàn client làm cạn kết nối, database từ chối. PgBouncer đứng giữa, gộp nhiều client vào một pool nhỏ. Bài này dựng THẬT Postgres + PgBouncer: 30 client chỉ thành 5 backend, và đo chi phí thiết lập kết nối đắt gấp 50 lần giữ kết nối.

Lập trình 22/09/2026 6 phút

Đọc EXPLAIN ANALYZE: query plan là ống nghe của bác sĩ database, và cách nghe cho đúng

Query chậm mà không biết vì sao? EXPLAIN ANALYZE cho biết database THỰC SỰ làm gì với query của bạn. Bài này đo thật trên bảng 1 triệu dòng trong PostgreSQL: cùng một query, chưa index chạy Seq Scan mất 10.764ms (quét cả bảng, đọc 7353 block); thêm index thành Bitmap Index Scan còn 0.116ms (14 block) — nhanh 93 lần. Kèm cách đọc từng con số: cost không phải ms, actual time mới thật, và rows dự đoán vs thật lộ khi planner đoán sai.

Lập trình 22/09/2026 6 phút

Index B-tree: vì sao tạo index rồi vẫn Seq Scan — bẫy non-sargable và cách viết query cho đúng

Bạn tạo index nhưng query vẫn chậm và EXPLAIN vẫn báo Seq Scan? Vì predicate không sargable — chỉ cần bọc cột trong một hàm là index nằm im vô dụng. Bài này đo thật trên bảng 1 triệu dòng: WHERE email=x dùng index (0.045ms), nhưng lower(email)=x quét cả bảng (54.857ms); age+1=31 chậm 12ms còn age=30 chỉ 1ms; và một bất ngờ — LIKE 'x%' với index thường vẫn Seq Scan, phải dùng text_pattern_ops.