Sự cố với select que from Question que order by RAND()
là DB của bạn sẽ đặt hàng tất cả các bản ghi trước khi trả lại một mục. Vì vậy, nó đắt tiền trong bộ dữ liệu lớn.
Một cách rẻ hơn để đạt được mục tiêu này bao gồm hai bước:
- Tìm tổng số hồ sơ từ nơi bạn sẽ chọn một.
- Nhận một mục ngẫu nhiên trong tập hợp này.
Để làm điều đó trong MySql ví dụ, bạn có thể làm:
select count(*) from question;
// using any programming language, choose a random number between 0 and count-1 (let's save this number in rdn), and finally
select * from question LIMIT $rdn, 1;
Ok, nhưng để làm được điều đó trong dữ liệu mùa xuân, bạn cần tạo một số truy vấn nguồn gốc ...
May mắn thay, chúng tôi có thể sử dụng phân trang để giải quyết điều đó. Trong giao diện Repository của bạn, tạo ra các phương pháp (một số kho có điều này mà không cần phải xác định nó):
Long count();
Page<Question> findAll(Pageable pageable);
Và trong dịch vụ của bạn, bạn có thể sử dụng kho lưu trữ của bạn theo cách sau:
public Question randomQuestion() {
Long qty = questionRepository.countAll();
int idx = (int)(Math.random() * qty);
Page<Question> questionPage = questionRepository.findAll(new PageRequest(idx, 1));
Question q = null;
if (questionPage.hasContent()) {
q = questionPage.getContent().get(0);
}
return q;
}
Nguồn
2017-03-27 18:45:54
Đây là một trong của những câu trả lời hoàn hảo, nơi (a) nó * chính xác * những gì tôi cần và (b) Google và tôi đã không thể tìm thấy bất cứ điều gì khác từ xa gần. Nhưng tôi nghĩ rằng bạn có một lỗi đánh máy: không nên "countAll()" là "count()"? – fivedogit