MySQL數據庫中隨機獲取一條或多條記錄

工作中會遇到從數據庫中隨機獲取一條或多條記錄的場景,下面介紹幾種隨機獲取的方法供參考。

首先創建個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。

發佈了64 篇原創文章 · 獲贊 28 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章