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

Phân trang: vì sao OFFSET 1 triệu chậm 3000 lần, và keyset pagination giữ tốc độ phẳng

OFFSET LIMIT là cách phân trang ai cũng viết, và nó hoạt động hoàn hảo... cho tới trang thứ 50.000. Bài này đo thật trên bảng 2 triệu dòng: OFFSET chậm dần tuyến tính — trang đầu 0.029ms nhưng trang cuối 144.941ms, vì nó phải đọc qua 1.000.020 dòng chỉ để lấy 20. Keyset pagination (WHERE id > last_id) giữ ~0.04ms phẳng ở mọi trang. Kèm plan chứng minh OFFSET quét rồi vứt, keyset nhảy thẳng.

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

Tối ưu query từ đầu tới cuối: cây quyết định, checklist, và một query từ 51ms xuống 3.7ms

Loạt SQL sâu đi qua 11 công cụ; bài cuối ghép chúng thành một quy trình. Query chậm không phải chuyện thử-sai — có cây quyết định rõ ràng bắt đầu từ EXPLAIN ANALYZE. Bài này đo thật một query chậm (JOIN + filter + ORDER BY LIMIT trên 2 triệu dòng): viết sargable một mình không đủ (vẫn 51ms), nhưng sargable + index đúng + ANALYZE đưa xuống 3.66ms — nhanh 14 lần. Kèm cây quyết định và checklist tối ưu.

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

Tối ưu throughput producer Kafka: batch, linger và nén — khi lz4 vừa nhanh hơn vừa nhỏ 24 lần

Producer Kafka mặc định đã nhanh, nhưng chỉnh đúng ba núm là tăng gấp đôi. Bài này đo thật trong lab: gom batch 128KB + linger 10ms cho throughput 2,25 lần (118 lên 266 MB/s) và độ trễ còn thấp hơn; nén lz4 vừa nhanh hơn không nén vừa nhỏ 24 lần trên đĩa, zstd nén tới 58 lần (26MB còn 460KB). Và vì sao đẩy batch quá to lại phản tác dụng.

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

Hiệu năng streaming gRPC: vì sao một stream nhanh gấp 61 lần 50.000 unary call, và flow control giữ cho khỏi tràn

Khi cần gửi nhiều message, chọn một stream hay nhiều unary call tạo ra khác biệt khổng lồ. Bài này đo thật trong go-lab: gửi 50.000 message qua 50.000 unary call riêng lẻ mất 2,06 giây (24k msg/s), còn qua một server-stream chỉ 33,6 mili-giây (1,49 triệu msg/s) — nhanh gấp 61 lần. Giải thích vì sao per-call overhead giết hiệu năng, và HTTP/2 flow control điều tiết backpressure thế nào để stream không làm tràn bộ nhớ.

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

Redis cho backend từ con số 0: vì sao một kho dữ liệu chạy MỘT luồng lại nhanh hơn 340.000 lệnh/giây

Redis nhanh một cách khó tin — hơn 340.000 lệnh mỗi giây, mỗi lệnh dưới một phần mười mili-giây. Điều nghịch lý: nó xử lý lệnh trên đúng MỘT luồng. Bài mở màn sê-ri dựng Redis thật trong Docker, đo throughput bằng redis-benchmark (SET 343.642/giây, GET 346.020/giây), giải thích ba lý do tốc độ (in-memory, single-thread không khoá, I/O đa hợp), và vì sao single-thread cũng chính là lý do mọi lệnh Redis nguyên tử.

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

Năm kiểu dữ liệu Redis: chọn đúng kiểu quyết định cả tốc độ lẫn bộ nhớ (leaderboard, bạn chung, và cái giá của sorted set)

Redis không phải chỉ là key-value string — nó có năm kiểu dữ liệu, mỗi kiểu giải một lớp bài toán. Bài này demo thật trong redis-lab cả năm: string/hash/list/set/sorted set, với use case thật (leaderboard bằng sorted set, bạn chung bằng SINTER một lệnh). Rồi đo MEMORY USAGE để thấy đánh đổi: hash 88 byte nhỏ hơn JSON 96 byte, nhưng sorted set tốn 87KB so với set 40KB cho cùng 1000 phần tử — cái giá của khả năng xếp hạng.