Pre-sort và Pre-aggregation - Khi index cũng không đủ nhanh

Hai kỹ thuật “chuẩn bị trước” dữ liệu ở tầng vật lý.

1. Bảng sắp xếp trước (Pre-sorted Table) - tối ưu cho quét phạm vi

Sắp dữ liệu vật lý liền kề nhau trên disk theo pattern truy cập:

-- MySQL: dùng composite primary key để sắp xếp vật lý
CREATE TABLE product_comments (
    product_id BIGINT,
    comment_id BIGINT AUTO_INCREMENT UNIQUE KEY,
    message TEXT,
    PRIMARY KEY (product_id, comment_id)   -- clustered index!
);
-- Comments của cùng product nằm LIÊN TIẾP trên disk → đọc nhanh hơn
-- (thay vì rải rác theo thứ tự thời gian tạo)
 
-- PostgreSQL: dùng CLUSTER (sắp xếp lại 1 lần, không tự duy trì)
CLUSTER product_comments USING product_comments_pkey;

Tận dụng clustered index của MySQL: biến random I/O thành sequential I/O cho pattern “lấy tất cả X của Y”.

2. Tính toán trước (Pre-aggregation)

Dashboard query phải aggregate hàng trăm nghìn row → không index nào giúp được. Giải pháp: lưu sẵn giá trị đã aggregate:

CREATE TABLE articles_stats (
    user_id BIGINT,
    publish_year INT,
    total_likes BIGINT,
    PRIMARY KEY (user_id, publish_year)
);
 
-- Query siêu nhanh:
SELECT total_likes FROM articles_stats
WHERE user_id = 1 AND publish_year = 2024;
-- Thay vì SUM(likes) trên hàng trăm nghìn rows

Cập nhật bằng trigger, job định kỳ, hoặc tăng dần khi ghi (xem bộ đếm phân tán trong Kỹ thuật thao tác dữ liệu hiệu quả).

Liên quan