Q

Quản trị viên

Là một lập trình viên yêu công nghệ, thích viết blog để chia sẻ kiến thức, kinh nghiệm lập trình và những điều thú vị trong thế giới tech.

2324 bài viết · Website
Lập trình 22/09/2026 8 phút

Sharding: đo thật trên 5 PostgreSQL — chia theo khoảng với khoá Zipf lệch 3,75 lần, hash cũng lệch 1,54 vì một user không chia nhỏ được, thêm mảnh bằng mod N dời 80% khoá, và đọc trong lúc dời trượt 48% nếu không đọc kép

Năm container PostgreSQL 16 làm năm mảnh, 200.000 sự kiện của 100.000 user. Chia theo khoảng user_id đẹp với khoá đều (lệch 1,00) nhưng với khoá Zipf thì mảnh đầu ôm 187.329 dòng, lệch 3,75; hash cũng lệch 1,54 vì user #0 một mình chiếm 13,5% dữ liệu. Muối top-10 user nóng hạ xuống 1,25, đổi lại đọc user nóng phải hỏi 4 mảnh. Chia theo thời gian dồn mọi dòng mới vào một mảnh: ghi chậm 1,6 lần. Thêm mảnh thứ 5: mod N dời 79,9% khoá, jump hash dời 20,0%; dời thật 39.684 dòng mất 251 ms, bộ đọc chỉ hỏi vị trí mới trượt 47,8%, đọc kép mới rồi cũ trượt 0.

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.

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

Bloom filter tự cài trong Go: kiểm "có thể có" bằng vài bit

Bloom filter là cấu trúc xác suất trả lời phần tử có thể có trong tập hay chắc chắn không — chỉ bằng một mảng bit và k hàm băm, không lưu phần tử. Đo thật khi tự cài trong Go: 1 triệu phần tử, 0 âm tính giả, dương tính giả đúng 1% như thiết kế, và bộ nhớ 1.20 MB so với 56.1 MB của set thường.

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

Nén Parquet hai tầng đo thật: encoding theo cột rồi codec byte, zstd nén còn 33,8 MB nhỏ hơn gzip 37,3 MB mà ghi nhanh hơn bảy lần (240 ms so với 1749 ms), và một cột mười giá trị lặp nhỏ hơn cột năm triệu giá trị duy nhất 417 lần nhờ dictionary

Parquet nén hai tầng: encoding theo cột (dictionary, RLE) giảm kích thước logic trước, rồi codec byte (snappy, gzip, zstd) nén nốt. Đo thật trong DuckDB 2.0 trên 5 triệu dòng: uncompressed 119,9 MB, snappy 71,1 MB, gzip 37,3 MB, zstd 33,8 MB; zstd nhỏ hơn gzip mà ghi nhanh hơn 7 lần (240 ms so với 1749 ms). Dictionary encoding: cột country 10 giá trị nén còn 0,01 MB so với cột id 5 triệu giá trị 4,88 MB, nhỏ hơn 417 lần. Phần lớn lợi ích đến từ tầng encoding, codec chỉ là lớp phủ.