15 điểm bởi GN⁺ 2025-05-22 | 4 bình luận | Chia sẻ qua WhatsApp
  • PostgreSQL 18 sẽ hỗ trợ UUIDv7 mặc định, cung cấp định danh duy nhất có thể sắp xếp và thân thiện với chỉ mục
  • UUIDv7 vẫn giữ được tính duy nhất và bảo mật trong môi trường phân tán của UUID hiện có, đồng thời áp dụng cấu trúc sắp xếp theo thời gian có lợi cho chỉ mục btree
  • Nó giải quyết hai nhược điểm đầu trong số các vấn đề của UUID trước đây là không thể sắp xếp, chỉ mục bị phân mảnh, kích thước bộ nhớ, qua đó hiện thực hóa sắp xếp theo thời gian và tối ưu chèn
  • Trong PostgreSQL 18, có thể tạo UUID bằng hàm uuidv7(), đồng thời cũng cung cấp khả năng trích xuất timestamp và nhập thời gian tùy chỉnh
  • Giờ đây, những lý do từng khiến người dùng ngần ngại dùng UUID làm khóa chính đã được gỡ bỏ, khiến đây trở thành lựa chọn phù hợp hơn cho hệ thống phân tán và môi trường đa tenant

PostgreSQL 18

  • Bản beta của PostgreSQL 18 đã được phát hành và đang được thử nghiệm với mục tiêu phát hành chính thức vào tháng 9
  • Các tính năng chính:
    • Async I/O: I/O bất đồng bộ dựa trên io_uring giúp tăng tốc 2~3 lần cho sequence scan và vacuum
    • Skip scan cho chỉ mục btree nhiều cột, tối ưu truy vấn OR/IN
    • Giữ nguyên thống kê planner giữa các lần nâng cấp
    • Hàm UUIDv7
    • Cột sinh ảo, đăng nhập OAuth, bổ sung thông tin I/O/CPU/WAL trong EXPLAIN, v.v.

Ưu điểm của UUID

  • Có thể tạo ID duy nhất trong môi trường phân tán
  • Tăng cường bảo mật nhờ định danh công khai không thể dự đoán
  • Có thể tạo ID trực tiếp từ client, giúp giảm thiểu giao tiếp với server

Nhược điểm của UUID truyền thống

  • Không thể sắp xếp
  • Hiệu năng chèn giảm do tính cục bộ kém của chỉ mục
  • Overhead do kích thước 128 bit

Cách UUIDv7 giải quyết vấn đề

  • Phiên bản UUID mới được giới thiệu theo RFC 9562 (công bố tháng 5/2024)
  • 48 bit đầu chứa timestamp dựa trên Unix Epoch, phần còn lại là tổ hợp giá trị ngẫu nhiên + bộ đếm
  • Có thể sắp xếp theo thời gian, đồng thời tăng hiệu quả chèn vào chỉ mục
  • UUIDv6 dành cho tương thích ngược, UUIDv8 dành cho mở rộng thử nghiệm/nhà cung cấp
  • Chỉ UUIDv7 mới thực sự là tiêu chuẩn mới có ý nghĩa thực tiễn

Sử dụng UUIDv7 trong PostgreSQL 18

  • Tạo UUID dựa trên thời điểm hiện tại bằng hàm uuidv7()
  • Có thể áp dụng offset thời gian mong muốn thông qua uuidv7(INTERVAL)
  • Có thể trích xuất phiên bản UUID và thời điểm tạo bằng các hàm uuid_extract_version(), uuid_extract_timestamp()
  • Ví dụ:
    CREATE TABLE test (  
        id uuid DEFAULT uuidv7() PRIMARY KEY,  
        name text  
    );  
    
    INSERT INTO test (name) VALUES ('foo');  
    INSERT INTO test (name) VALUES ('bar');  
    INSERT INTO test (id, name) VALUES (uuidv7(INTERVAL '-1 hour'), 'oldest');  
    
    SELECT uuid_extract_timestamp(id), name FROM test ORDER BY id;  
    
  • uuidv4() được thêm vào như bí danh của gen_random_uuid()

Kết luận và khuyến nghị

  • UUIDv7 phù hợp với những người dùng từng gặp vấn đề hiệu năng khi dùng UUID truyền thống
  • Vừa đảm bảo khả năng sắp xếp và hiệu năng chỉ mục, vừa giữ được các ưu điểm của UUID
  • Có thể thử nghiệm ngay từ bây giờ trên bản beta PostgreSQL 18
  • Là lựa chọn phù hợp để tạo ID trong hệ thống phân tán, ứng dụng đa tenant và môi trường serverless
    > “UUIDv7 là một bổ sung âm thầm nhưng mạnh mẽ, khiến người ta phải cân nhắc lại việc dùng UUID làm khóa chính trong Postgres”

4 bình luận

 
jaylee 2025-05-23

Tôi đang dùng Prisma + ULID thay thế. Nó ngắn hơn nhiều và tốt hơn.

 
ssssut 2025-05-22

Tôi vẫn đang tự tạo và dùng các hàm như uuid_generate_v7(), nên đây đúng là một tin đáng mừng.

 
stomx 2025-05-22

Ồ!!

 
halfenif 2025-05-22

Ồ...!