Tôi đã tìm thấy một giải pháp dựa vào các thuộc tính của dữ liệu trong bảng. Tôi muốn có một giải pháp tổng quát hơn không phụ thuộc vào dữ liệu hiện tại, nhưng trong thời điểm hiện tại đó là giải pháp tốt nhất mà tôi có.
Vấn đề với truy vấn ban đầu:
SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND LastX >= ? LIMIT 10;
là việc thực thi có thể yêu cầu quét một tỷ lệ lớn các mục nhập trong FirstX
, LastX
, P
lập chỉ mục khi điều kiện đầu tiên FirstX <= ?
được phần lớn các hàng hài lòng.
Những gì tôi đã làm để giảm thời gian thực thi là quan sát rằng LastX-FirstX
tương đối nhỏ.
Tôi đã chạy truy vấn:
SELECT MAX(LastX-FirstX) FROM SomeTable;
và nhận 4200000
.
Điều này có nghĩa là FirstX >= LastX – 4200000
cho tất cả các hàng trong bảng.
Vì vậy, để đáp ứng LastX >= ?
, chúng ta cũng phải thỏa mãn FirstX >= ? – 4200000
.
Vì vậy, chúng ta có thể thêm một điều kiện vào truy vấn như sau:
SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND FirstX >= ? - 4200000 AND LastX >= ? LIMIT 10;
Trong ví dụ mà tôi đã kiểm tra trong câu hỏi, số lượng mục nhập chỉ mục được xử lý đã giảm từ 2104820
thành 18
và thời gian chạy đã giảm từ 0,563 giây thành 0,0003 giây .
Tôi đã thử nghiệm truy vấn mới với cùng một 120000
các giá trị của X
. Đầu ra giống với truy vấn cũ. Thời gian đã giảm xuống từ hơn 10 giờ đến 5,5 phút , nhanh hơn 100 lần .