trong MySQL hiệu suất cao ở trang 158 họ nói về việc chia nhỏ các truy vấn phức tạp thành các truy vấn đơn giản:
Chuyển đổi
SELECT * FROM tag
JOIN tag_post ON tag_post.tag_id=tag.id
JOIN post ON tag_post.post_id=post.id
WHERE tag.tag='mysql';
Đến
SELECT * FROM tag WHERE tag='mysql';
SELECT * FROM tag_post WHERE tag_id=1234;
SELECT * FROM post WHERE post.id in (123,456,567,9098,8904);
Và sắp xếp thực hiện tham gia chính mình trong ứng dụng của bạn.
Câu hỏi của tôi là liệu đây có phải là một ý tưởng hay không khi truy vấn cuối cùng có mệnh đề where với vài nghìn ID cần khớp (bảng thực tế có khoảng 500k mục).
Ý tôi là, sẽ có một hình phạt lớn khi có một truy vấn như
SELECT * FROM post WHERE post.id in (123,456,567, ... <a few thousand IDs here> ... ,9098,8904);
thay vì tuyên bố tham gia ở trên? Nó có giúp chuyển logic này sang Thủ tục lưu trữ bên trong Cơ sở dữ liệu không (trong khi xem xét các quy trình được lưu trữ kém được thực hiện trong MySQL) như thế nào?
post
bảng, bài viết đó là trong địa chỉ? Nếu vậy, bạn có thể chạy truy vấn dựa trên mã bưu chính (zip) hoặc theo thành phố
post.id
từ đó và sử dụng IN
mệnh đề trong truy vấn cuối cùng? Hay đó là những gì bạn đang làm?
IN
mệnh đề với vài nghìn ID