Tôi đang tìm một cách hiệu quả để chọn ngẫu nhiên 100 hàng thỏa mãn các điều kiện nhất định từ một bảng MySQL với hàng triệu hàng.Làm thế nào để chọn ngẫu nhiên nhiều hàng thỏa mãn các điều kiện nhất định từ một bảng MySQL?
Hầu hết mọi thứ tôi đã tìm thấy đều đề nghị tránh sử dụng ORDER BY RAND() vì hiệu suất và khả năng mở rộng kém.
Tuy nhiên, this article đề xuất ORDER BY RAND() vẫn có thể được sử dụng làm "cách tốt đẹp và nhanh chóng" để tìm nạp dữ liệu randow.
Dựa trên bài viết này, dưới đây là một số mã ví dụ cho thấy những gì tôi đang cố gắng hoàn thành. Câu hỏi của tôi là:
Đây có phải là cách hiệu quả để chọn ngẫu nhiên 100 (hoặc tới vài trăm) hàng từ một bảng có khả năng là hàng triệu hàng không?
Khi nào hiệu suất sẽ trở thành sự cố?
SELECT user.* FROM ( SELECT id FROM user WHERE is_active = 1 AND deleted = 0 AND expiretime > '.time().' AND id NOT IN (10, 13, 15) AND id NOT IN (20, 30, 50) AND id NOT IN (103, 140, 250) ORDER BY RAND() LIMIT 100 ) AS random_users STRAIGHT JOIN user ON user.id = random_users.id
Có ý nghĩa khi chọn các giá trị ngẫu nhiên trên một trường có chỉ mục. – Kayser
@Kayser, tôi lo ngại rằng chúng tôi vẫn phải quét TẤT CẢ các hàng cho điều kiện WHERE. Điều đó sẽ ảnh hưởng đến hiệu suất với một bảng lớn (có khả năng là hàng triệu hàng)? – user1298692
Phương pháp với tùy chọn pk-subselect có khả năng chỉ giảm nhẹ thời gian thực hiện. Đó là bởi vì có hoặc không có kỹ thuật này, rand() được gọi cho tất cả các hàng phù hợp và số hàng cần sắp xếp giống nhau. Có lẽ điều này là thú vị nếu "người dùng" có nhiều cột hoặc kích thước cột lớn và mysql không đủ thông minh để chờ đợi sau khi LIMIT diễn ra để hiện thực hóa người dùng. * (Cần được kiểm tra). –