Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Thủ tục được lưu trữ mysql chậm hơn 20 lần so với truy vấn tiêu chuẩn

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách lưu trữ ảnh trong cơ sở dữ liệu MySQL

  2. Xóa truy vấn không hoạt động trong mysql

  3. MySQL - tìm các từ bao quanh từ khóa được tìm kiếm

  4. Cách kiểm tra trạng thái kết nối MySQL trong C #

  5. SQLSTATE [23000]:Vi phạm ràng buộc toàn vẹn với ràng buộc hợp lệ