Mặc dù không có cái gọi là "đặt hàng nhanh bằng rand ()", nhưng có một giải pháp cho tác vụ cụ thể của bạn.
Để nhận bất kỳ hàng ngẫu nhiên nào , bạn có thể làm như blogger người Đức này làm: http://web.archive.org/web/20200211210404/http://www.roberthartung.de/mysql-order-by-rand-a- nghiên cứu điển hình về các lựa chọn thay thế / (Tôi không thể thấy url liên kết nóng. Nếu ai thấy url, vui lòng chỉnh sửa liên kết.)
Văn bản bằng tiếng Đức, nhưng mã SQL hơi xuống trang và nằm trong các ô lớn màu trắng, vì vậy không khó để nhìn thấy.
Về cơ bản những gì anh ta làm là thực hiện một thủ tục thực hiện công việc để có được một hàng hợp lệ. Điều đó tạo ra một số ngẫu nhiên từ 0 đến max_id, hãy thử tìm nạp một hàng và nếu nó không tồn tại, hãy tiếp tục cho đến khi bạn nhấn một hàng. Anh ta cho phép tìm nạp x số hàng ngẫu nhiên bằng cách lưu trữ chúng trong bảng tạm thời, vì vậy bạn có thể viết lại quy trình để nhanh hơn một chút khi chỉ tìm nạp một hàng.
Nhược điểm của điều này là nếu bạn xóa RẤT NHIỀU hàng và có những khoảng trống lớn, thì khả năng lớn là nó sẽ bỏ lỡ hàng tấn lần, khiến nó không hiệu quả.
Cập nhật:Thời gian thực hiện khác nhau
Nó có thể liên quan đến việc lập chỉ mục. id
được lập chỉ mục và nhanh chóng để truy cập, trong khi thêm username
đến kết quả, có nghĩa là nó cần phải đọc nó từ mỗi hàng và đưa nó vào bảng bộ nhớ. Với *
nó cũng phải đọc mọi thứ vào bộ nhớ, nhưng nó không cần phải nhảy xung quanh tệp dữ liệu, nghĩa là không mất thời gian tìm kiếm.
Điều này chỉ tạo ra sự khác biệt nếu có các cột có độ dài thay đổi (varchar / text), có nghĩa là nó phải kiểm tra độ dài, sau đó bỏ qua độ dài đó, trái ngược với việc chỉ bỏ qua một độ dài đã đặt (hoặc 0) giữa mỗi hàng.