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

Tối ưu hóa CHỌN ... Ở ĐÂU TRONG (...)

SELECT * FROM  products                         <<-- select * is non-optimal
WHERE  prodid in (10331,11639,12127..) 
ORDER BY Field(prodid, 10331,11639,12127...);   <<-- your problem is here

Đầu tiên hãy đặt một chỉ mục trên prodid xem câu trả lời của @ Anthony.

Hơn thay đổi truy vấn để đọc:

SELECT only,the,fields,you,need FROM  products
WHERE  prodid in (10331,11639,12127..) 
ORDER BY prodid

Nếu bạn chắc chắn rằng IN của mình danh sách được sắp xếp tăng dần trước khi cung cấp cho IN mệnh đề order by prodid sẽ mang lại kết quả giống nhau als order by field(...

  • Việc sử dụng một hàm thay vì một trường sẽ giết chết bất kỳ cơ hội sử dụng chỉ mục nào, gây ra sự chậm chạp.
  • select * sẽ tìm nạp dữ liệu mà bạn có thể không cần, gây ra truy cập đĩa bổ sung, sử dụng thêm bộ nhớ và lưu lượng mạng bổ sung.
  • Trên InnoDB, nếu bạn chỉ select các trường được lập chỉ mục, MySQL sẽ không bao giờ đọc bảng mà chỉ tiết kiệm thời gian lập chỉ mục (trong trường hợp của bạn, đây có thể không phải là vấn đề)

Có một số thủ thuật bạn có thể sử dụng.

  • Nếu bảng sản phẩm không quá lớn, bạn có thể đặt nó làm memory bảng, được lưu trữ trong RAM. Đừng làm điều này đối với các bảng lớn, nó sẽ làm chậm những thứ khác.
    Bạn chỉ có thể sử dụng hash các chỉ mục trên bảng bộ nhớ.
  • Nếu sản phẩm liên tục, bạn có thể sử dụng BETWEEN 1000 AND 1019 thay vì
    IN (1000, 1001 ..., 1019)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng Đếm để tìm số lần xuất hiện

  2. MySQL cho biết:Tài liệu # 1045 - Quyền truy cập bị từ chối đối với người dùng 'root' @ 'localhost' (sử dụng mật khẩu:NO)

  3. Cách xác minh quyền sở hữu miền

  4. cách tìm bản ghi đầu tiên và bản ghi cuối cùng từ bảng mysql

  5. Gây ra bởi:java.time.DateTimeException:Xung đột được tìm thấy:Field DayOfWeek 6 khác với DayOfWeek 2 có nguồn gốc từ 2016-01-30