Tôi nghi ngờ sự chậm chạp là trong việc tìm nạp các hàng, số lượng hàng được trả về, chứ không phải là 5000+ trình giữ chỗ ràng buộc trong câu lệnh. pId IN ( ? , ? , ... , ? )
Đề xuất của tôi là kiểm tra chỉ trả về một hàng duy nhất, cung cấp một giá trị được biết là tồn tại / trả về một hàng và sau đó là 4999+ giá trị được biết là không tồn tại / không trả về một hàng.
Ví dụ:nếu chúng ta biết giá trị pId cao nhất trong bảng, hãy sử dụng các giá trị cao hơn giá trị đó, cung cấp các giá trị ràng buộc cho một câu lệnh như thế này
... pId IN ( ? , ? , ? , ... , ? )
vì vậy kết quả sẽ tương đương với việc chạy
... pId IN ( 99999999 , 99999998 , 99999997 , ... , 42 )
đó sẽ là kết quả tương tự mà chúng tôi sẽ nhận được khi chạy
... pId IN ( 42 )
Kỳ vọng của chúng tôi là chỉ trả về một hàng (pId =42).
Sau đó, so sánh thời gian của (hơn 5000 giá trị ràng buộc trả về 1 hàng) với hai giá trị ràng buộc trả về một hàng duy nhất
... pId IN ( 99999999 , 42 )
Và xem liệu có sự khác biệt đáng kể về hiệu suất hay không.
(Còn nhiều việc phải làm với hơn 5000 giá trị ràng buộc, nhưng tôi sẽ không mong đợi một rất lớn khác biệt, nhưng nó nên được kiểm tra.
Suy nghĩ kỹ một chút, có thể dễ dàng hơn khi thiết lập thử nghiệm bằng cách sử dụng tất cả các giá trị ràng buộc hiện có và chỉ cần thêm LIMIT 2
vào cuối truy vấn. (Tôi không chắc liệu MySQL có một số cải tiến về hiệu suất cho LIMIT 2
hay không .
Có thể tốt hơn nếu thêm một điều kiện như AND pId * 10 = 420
Mục tiêu là cung cấp một loạt các giá trị ràng buộc nhưng chỉ trả về một hoặc hai hàng.
Một thử nghiệm khác sẽ là trả về một loạt các hàng, nhưng chỉ sử dụng một vài giá trị ràng buộc. Có thể là một điều kiện phạm vi trả về hơn 5000 hàng.
Truy vấn có thể là:
... pId >= ? AND pId <= ?
với phạm vi đủ lớn giữa các giá trị được cung cấp mà chúng tôi nhận được trong vùng lân cận là 5000 hàng.
Và so sánh hiệu suất.
Dự đoán của tôi (đoán?) Là hiệu suất sẽ tương quan nhiều hơn với số hàng được trả về, thay vì số lượng giá trị ràng buộc.
Tôi không chắc đây có phải là câu trả lời cho câu hỏi của bạn hay không, nhưng đó là cách tiếp cận mà tôi sẽ thực hiện để trả lời câu hỏi ... "điều gì khiến điều này bị chậm, số lượng giá trị liên kết hoặc số hàng được trả về? "