隨機獲得MySQL數(shù)據(jù)表的一條或多條記錄有很多方法,下面我就以users(userId失驶,userName土居,password……)表(有一百多萬條記錄)為例,對比講解下幾個方法效率問題:
select * from users order by rand() LIMIT 1
執(zhí)行該sql語句嬉探,老半天沒有反應(yīng)擦耀,最后被迫手動停止執(zhí)行,怎個傷人了得吧獭眷蜓!后來我查了一下MYSQL手冊,里面針對RAND()的提示大概意思就是胎围,在ORDER BY從句里面不能使用RAND()函數(shù)吁系,因為這樣會導(dǎo)致數(shù)據(jù)列被多次掃描,導(dǎo)致效率相當相當?shù)牡桶谆辏⌒什恍衅耍屑墒褂茫?/p>SELECT * FROM users AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(userId) FROM
users
)-(SELECT MIN(userId) FROM users))+(SELECT MIN(userId) FROM users)) AS userId) AS t2 WHERE t1.userId >= t2.userId ORDER BY t1.userId LIMIT 1
執(zhí)行該sql語句,用時0.031s福荸,效率沒說的蕴坪,相當?shù)慕o力!心里那個爽啊敬锐,緊接著背传,我把”LIMIT 1“改為了”LIMIT 100“ 隨機取一百條記錄,用時0.048台夺,給力吧径玖。可是就在此時問題出現(xiàn)了颤介,發(fā)現(xiàn)結(jié)果好像不是隨機的梳星?為了驗證結(jié)果赞赖,又執(zhí)行了N次,真不是隨機的丰泊, 問題出現(xiàn)在”O(jiān)RDER BY t1.userId“這里薯定,按userId排序了。隨機取一條記錄還是不錯的選擇瞳购,多條就不行了啊亏推!SELECT * FROM users WHERE userId >= ((SELECT MAX(userId) FROM users)-(SELECT MIN(userId) FROM users)) * RAND() + (SELECT MIN(userId) FROM users) LIMIT 1
執(zhí)行該sql語句学赛,用時0.039s,效率太給力了吞杭!接著我就把”LIMIT 1“改為了”LIMIT 10000“盏浇,用時0.063s。經(jīng)過多次驗證芽狗,哥對燈發(fā)誓绢掰,結(jié)果肯定是隨機的!
結(jié)論:隨機取一條或多條記錄童擎,方法都不錯滴劲!-
通過sql獲得最大值和最小值,然后通過php的rand生成一個隨機數(shù)randnum顾复,再通過SELECT * FROM users WHERE userId >= randnum LIMIT 1班挖,效率應(yīng)該差不多,
結(jié)論:方法1效率不行芯砸,切忌使用萧芙;隨機獲得一條記錄,方法2是相當不錯的選擇假丧,采用JOIN的語法比直接在WHERE中使用函數(shù)效率還是要高一些的双揪,不過方法3也不錯;隨機獲得多條記錄包帚,方法3沒說的渔期!
方法札記
1 將數(shù)據(jù)庫中的記錄按照隨機數(shù)進行排序,利用LIMIT
取前面n
條記錄即可婴噩。
SELECT * FROM news_tagging_app_tag as t ORDER BY rand() LIMIT 50;
附
該文章于2017年8月30日于CSDN上首次發(fā)表擎场,2017年12月24日搬家至此!