Giới thiệu
Trong các ứng dụng web hiện đại, tốc độ và bảo mật dữ liệu là hai yếu tố then chốt quyết định trải nghiệm người dùng. Supabase – một nền tảng backend-as-a-service mã nguồn mở – cung cấp Row Level Security (RLS) và indexing như những công cụ mạnh mẽ để kiểm soát truy cập và tăng tốc độ truy vấn. Tuy nhiên, việc kết hợp hai tính năng này không phải lúc nào cũng đơn giản. Bài viết này sẽ phân tích cách tối ưu hiệu năng truy vấn khi sử dụng RLS, đồng thời đưa ra các chiến lược indexing phù hợp để đảm bảo ứng dụng vừa nhanh vừa an toàn.
Row Level Security (RLS) và ảnh hưởng đến hiệu năng
RLS hoạt động như thế nào
RLS trong Supabase cho phép bạn định nghĩa các policies (chính sách) kiểm soát quyền truy cập từng dòng dữ liệu trong bảng. Mỗi policy được viết dưới dạng một hàm trả về boolean, quyết định xem user có được phép đọc, chèn, cập nhật hay xóa dòng đó hay không. Điều này mang lại lợi ích bảo mật lớn, nhưng đồng thời cũng thêm một lớp logic được đánh giá cho mỗi truy vấn.
Tác động đến tốc độ truy vấn
Khi RLS được kích hoạt, mỗi lệnh SELECT, INSERT, UPDATE, DELETE sẽ phải đánh giá policy cho từng dòng trước khi trả về kết quả. Nếu policy phức tạp hoặc dữ liệu lớn, chi phí đánh giá có thể tăng đáng kể. Ví dụ, một policy kiểm tra user_id = auth.uid() trên bảng có hàng triệu dòng có thể buộc PostgreSQL quét toàn bộ bảng trước khi lọc, dẫn đến latency cao.
Chiến lược indexing cho RLS
Indexing cột tham chiếu trong policy
Để giảm thiểu chi phí quét, bạn nên tạo index trên các cột được sử dụng trong policy. Nếu policy thường xuyên kiểm tra user_id = auth.uid(), hãy tạo index trên user_id:
CREATE INDEX idx_table_user_id ON table_name(user_id);Với các policy phức tạp hơn, chẳng hạn kiểm tra nhiều cột hoặc điều kiện logic, composite index có thể hữu ích:
CREATE INDEX idx_table_user_org ON table_name(user_id, organization_id);