Tối ưu hóa hiệu suất cơ sở dữ liệu tiếp tục là một thách thức quan trọng đối với các ứng dụng hiện đại, đặc biệt khi xử lý các thao tác join phức tạp. Readyset , một lớp caching được thiết kế cho độ trễ truy vấn dưới mili giây, gần đây đã giải quyết một nút thắt cổ chai đáng kể trong hệ thống của họ: straddled joins trong quá trình cache miss. Những join này bao gồm các điều kiện lọc ở cả hai phía của thao tác join, tạo ra những thách thức về hiệu suất mà các phương pháp tối ưu hóa truyền thống khó có thể giải quyết hiệu quả.
![]() |
---|
Tối ưu hóa hiệu suất cơ sở dữ liệu trong Readyset , giải quyết thách thức với straddled joins |
Nguyên nhân gốc: Đọc dữ liệu quá mức
Cuộc điều tra hiệu suất đã tiết lộ một thủ phạm đáng ngạc nhiên. Ban đầu, các kỹ sư nghi ngờ nén dữ liệu là nút thắt cổ chai, vì profiling cho thấy 30% thời gian thực thi được dành cho việc giải nén. Tuy nhiên, việc chuyển đổi thuật toán nén chỉ chuyển vấn đề sang bão hòa disk I/O. Vấn đề thực sự là lượng dữ liệu không cần thiết khổng lồ được đọc từ bộ nhớ.
Trong straddled joins với độ chọn lọc không đồng đều, phương pháp hash join cũ sẽ đánh giá độc lập cả hai phía của join. Điều này có nghĩa là đọc gần như toàn bộ các bảng ngay cả khi một phía có các điều kiện có tính chọn lọc cao. Ví dụ, tìm một người dùng bằng email trong khi cũng lọc 90% đơn hàng theo trạng thái dẫn đến việc tạo ra hàng triệu hàng không cần thiết sẽ bị loại bỏ sau thao tác join.
Giảm thiểu I/O: Phương pháp trước đây yêu cầu khoảng 10K IOPS với 80% mức sử dụng thiết bị cho các truy vấn đơn lẻ
Index Condition Pushdown: Một phương pháp thông minh hơn
Giải pháp đến thông qua việc triển khai Index Condition Pushdown ( ICP ), điều này thay đổi cơ bản cách thức các join này thực thi. Thay vì lọc độc lập cả hai phía, phương pháp mới trước tiên đánh giá phía có tính chọn lọc cao hơn, sau đó sử dụng những kết quả đó để xây dựng các lookup có mục tiêu cho phía còn lại.
Chiến lược này tận dụng hiệu quả các compound index. Khi tìm kiếm đơn hàng với trạng thái cụ thể thuộc về một người dùng cụ thể, hệ thống giờ đây có thể sử dụng index trên cả cột user_id và status để chỉ lấy những hàng liên quan. Điều này loại bỏ nhu cầu quét các phần lớn của bảng và giảm đáng kể việc sử dụng bộ nhớ.
Tối ưu hóa bộ nhớ: Loại bỏ nhu cầu phải cụ thể hóa hàng triệu dòng dữ liệu mà sẽ bị loại bỏ sau các phép join
Sự công nhận từ cộng đồng và các triển khai tương tự
Cộng đồng cơ sở dữ liệu đã công nhận mô hình tối ưu hóa này trên các hệ thống khác nhau. Các database engine khác đã triển khai các phương pháp tương tự, với một số báo cáo những cải thiện hiệu suất tương đương - từ các truy vấn 6 giây xuống còn 50 mili giây. Kỹ thuật này đã được áp dụng dưới nhiều tên gọi khác nhau, bao gồm pushdown joins trong một số hệ thống, mặc dù khái niệm cốt lõi vẫn nhất quán trên các triển khai.
Chúng tôi cũng đã đi từ khoảng 6 giây xuống 50ms. Tốc độ tăng khổng lồ.
Một số nhà phát triển đã lưu ý rằng mặc dù thuật ngữ có thể khác nhau giữa các hệ thống, nguyên tắc tối ưu hóa cơ bản của việc giảm di chuyển dữ liệu không cần thiết và tận dụng index hiệu quả hơn đang trở thành một phương pháp tiêu chuẩn để xử lý các tình huống join phức tạp.
Cải thiện hiệu suất: Tăng tốc lên đến 450 lần cho các truy vấn straddled join
Tác động thực tế
Tối ưu hóa này giải quyết một tình huống production phổ biến nơi các ứng dụng cần lọc dữ liệu trên nhiều bảng liên quan. Ví dụ, các nền tảng thương mại điện tử thường xuyên cần tìm người dùng với các thuộc tính cụ thể và đơn hàng của họ phù hợp với tiêu chí nhất định. Phương pháp trước đây sẽ đọc lượng lớn dữ liệu không liên quan, trong khi phương pháp mới nhắm mục tiêu chính xác chỉ những bản ghi cần thiết.
Cải thiện này đặc biệt có giá trị đối với các hệ thống xử lý khối lượng công việc lớn nơi ngay cả những không hiệu quả nhỏ cũng có thể tích tụ thành những vấn đề hiệu suất đáng kể. Bằng cách giảm các thao tác I/O và sử dụng bộ nhớ, tối ưu hóa này không chỉ cải thiện tốc độ truy vấn mà còn giảm tổng thể mức tiêu thụ tài nguyên hệ thống.
Tham khảo: Optimizing Straddled Joins in Readyset: From Hash Joins to Index Condition Pushdown