Chỉ là phỏng đoán:
Khi bạn chạy truy vấn bằng tay, biểu thức WHERE ('test' IS NULL or COL1 = 'test')
có thể được tối ưu hóa khi truy vấn đang được phân tích cú pháp. Trình phân tích cú pháp có thể thấy rằng chuỗi 'test'
không phải là null, vì vậy nó chuyển đổi thử nghiệm thành WHERE COL1 = 'test'
. Và nếu có chỉ mục trên COL1
cái này sẽ được sử dụng.
Tuy nhiên, khi bạn tạo một thủ tục được lưu trữ, quá trình phân tích cú pháp xảy ra khi thủ tục được tạo. Tại thời điểm đó, nó không biết những gì @param
sẽ và phải triển khai truy vấn dưới dạng quét tuần tự bảng.
Hãy thử thay đổi quy trình của bạn thành:
IF @param IS NULL
THEN BEGIN
SELECT * FROM table1
UNION ALL
SELECT * FROM table2
...
END;
ELSE BEGIN
SELECT * FROM table1 WHERE col1 = @param
UNION ALL
SELECT * FROM table2 WHERE col1 = @param
...
END;
END IF;
Tôi không có nhiều kinh nghiệm với các thủ tục được lưu trữ trong MySQL, vì vậy tôi không chắc đó là cú pháp đúng.