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ụnghash
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)