工作中會遇到從數據庫中隨機獲取一條或多條記錄的場景,下面介紹幾種隨機獲取的方法供參考。
首先創建個users表演示
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
表中存放30萬記錄。
1、使用order by rand()
SELECT * FROM users ORDER BY RAND() LIMIT 1;
LIMIT 1的執行時間:0.559s, LIMIT 100 耗時0.660s。
此種方法在數據量小的情況下可以使用,但在生產環境不建議使用。
MYSQL手冊裏面針對RAND()的提示大概意思就是,在 ORDER BY從句裏面不能使用RAND()函數,因爲這樣會導致數據列被多次掃描,導致效率相當相當的低,效率不行,切忌使用。
2、使用join及rand()函數
SELECT * FROM users AS t1 JOIN (SELECT ROUND(RAND()*(SELECT MAX(id)
FROM users)) AS id) AS t2 WHERE t1.id>=t2.id ORDER BY t1.id LIMIT 1;
此sql隨機獲取一條的時間是0.014s,LIMIT 100時耗時 0.020s,性能上沒差多少。
獲取多條的話有時會達不到要求(獲取的記錄數可能達不到多條)
3、子查詢及rand()函數
SELECT * FROM users as t1 WHERE t1.id>=(RAND()*(SELECT MAX(id) FROM users)) LIMIT 1;
隨機去一條的耗時:0.015,LIMIT 100時耗時 0.026s。
隨機獲取一條記錄推薦使用 第2種方法,在30萬條記錄時也只需0.014s。