Việc lấy một bản ghi thực sự ngẫu nhiên có thể bị chậm. Không thực sự có nhiều điều để giải quyết vấn đề này; nếu bạn muốn nó thực sự ngẫu nhiên, thì truy vấn phải tải tất cả dữ liệu có liên quan để biết nó phải chọn bản ghi nào.
Tuy nhiên, may mắn thay, có nhiều cách nhanh hơn để làm điều đó. Chúng không hoàn toàn ngẫu nhiên, nhưng nếu bạn hài lòng khi đánh đổi một chút ngẫu nhiên thuần túy để lấy tốc độ, thì chúng sẽ đủ tốt cho hầu hết các mục đích.
Với ý nghĩ đó, cách nhanh nhất để có được một bản ghi "ngẫu nhiên" là thêm một cột bổ sung vào DB của bạn, cột này được điền với một giá trị ngẫu nhiên. Có lẽ một băm MD5 muối của khóa chính? Sao cũng được. Thêm các chỉ mục thích hợp trên cột này, sau đó chỉ cần thêm cột vào ORDER BY
của bạn trong truy vấn và bạn sẽ lấy lại hồ sơ của mình theo thứ tự ngẫu nhiên.
Để nhận một bản ghi ngẫu nhiên, chỉ cần chỉ định LIMIT 1
và thêm WHERE random_field > $random_value
trong đó giá trị ngẫu nhiên sẽ là một giá trị trong phạm vi của trường mới của bạn (chẳng hạn như băm MD5 của một số ngẫu nhiên).
Tất nhiên mặt trái ở đây là mặc dù hồ sơ của bạn sẽ theo thứ tự ngẫu nhiên, nhưng chúng sẽ bị mắc kẹt theo cùng một thứ tự ngẫu nhiên. Tôi đã nói rằng đó là giao dịch hoàn hảo cho tốc độ truy vấn. Bạn có thể giải quyết vấn đề này bằng cách cập nhật chúng định kỳ với các giá trị mới, nhưng tôi đoán đó có thể là một vấn đề đối với bạn nếu bạn cần giữ cho nó luôn mới.
Mặt khác là việc thêm một cột bổ sung có thể là quá nhiều để hỏi liệu bạn có bị ràng buộc về bộ nhớ hay không và DB của bạn đã có kích thước lớn hoặc liệu bạn có một DBA nghiêm ngặt để vượt qua trước khi bạn có thể thêm cột hay không. Nhưng một lần nữa, bạn phải đánh đổi một thứ gì đó; nếu bạn muốn tốc độ truy vấn, bạn cần thêm cột này.
Dù sao, tôi hy vọng điều đó sẽ hữu ích.