隨機(jī)獲取Mysql數(shù)據(jù)表的一條或多條記錄

隨機(jī)獲得MySQL數(shù)據(jù)表的一條或多條記錄有很多方法,下面我就以u(píng)sers(userId,userName,password……)表(有一百多萬條記錄)為例,對(duì)比講解下幾個(gè)方法效率問題:

  1. select * from users order by rand() LIMIT 1
    執(zhí)行該sql語句,老半天沒有反應(yīng),最后被迫手動(dòng)停止執(zhí)行,怎個(gè)傷人了得啊!后來我查了一下MYSQL手冊(cè),里面針對(duì)RAND()的提示大概意思就是,在ORDER BY從句里面不能使用RAND()函數(shù),因?yàn)檫@樣會(huì)導(dǎo)致數(shù)據(jù)列被多次掃描,導(dǎo)致效率相當(dāng)相當(dāng)?shù)牡停⌒什恍?,切忌使用?/p>

  2. 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語句,用時(shí)0.031s,效率沒說的,相當(dāng)?shù)慕o力!心里那個(gè)爽啊,緊接著,我把”LIMIT 1“改為了”LIMIT 100“ 隨機(jī)取一百條記錄,用時(shí)0.048,給力吧??墒蔷驮诖藭r(shí)問題出現(xiàn)了,發(fā)現(xiàn)結(jié)果好像不是隨機(jī)的?為了驗(yàn)證結(jié)果,又執(zhí)行了N次,真不是隨機(jī)的, 問題出現(xiàn)在”O(jiān)RDER BY t1.userId“這里,按userId排序了。隨機(jī)取一條記錄還是不錯(cuò)的選擇,多條就不行了??!

  3. 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語句,用時(shí)0.039s,效率太給力了!接著我就把”LIMIT 1“改為了”LIMIT 10000“,用時(shí)0.063s。經(jīng)過多次驗(yàn)證,哥對(duì)燈發(fā)誓,結(jié)果肯定是隨機(jī)的!
    結(jié)論:隨機(jī)取一條或多條記錄,方法都不錯(cuò)!

  4. 通過sql獲得最大值和最小值,然后通過php的rand生成一個(gè)隨機(jī)數(shù)randnum,再通過SELECT * FROM users WHERE userId >= randnum LIMIT 1,效率應(yīng)該差不多,

    結(jié)論:方法1效率不行,切忌使用;隨機(jī)獲得一條記錄,方法2是相當(dāng)不錯(cuò)的選擇,采用JOIN的語法比直接在WHERE中使用函數(shù)效率還是要高一些的,不過方法3也不錯(cuò);隨機(jī)獲得多條記錄,方法3沒說的!


方法札記
1 將數(shù)據(jù)庫中的記錄按照隨機(jī)數(shù)進(jìn)行排序,利用LIMIT取前面n條記錄即可。

SELECT * FROM news_tagging_app_tag as t ORDER BY rand() LIMIT 50;


該文章于2017年8月30日于CSDN上首次發(fā)表,2017年12月24日搬家至此!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • MySQL很多時(shí)候需要獲取隨機(jī)數(shù)據(jù),舉個(gè)例子,要從tablename表中隨機(jī)提取一條記錄,大家一般的寫法就是: S...
    J_xu閱讀 3,116評(píng)論 0 0
  • 50個(gè)常用的sql語句Student(S#,Sname,Sage,Ssex) 學(xué)生表Course(C#,Cname...
    哈哈海閱讀 1,335評(píng)論 0 7
  • 什么是SQL數(shù)據(jù)庫: SQL是Structured Query Language(結(jié)構(gòu)化查詢語言)的縮寫。SQL是...
    西貝巴巴閱讀 2,007評(píng)論 0 10
  • 今天這樣的排頭圖片是有原因的,上班的路上有了一個(gè)特別的想法,付愛寶天使和付愛寶精靈是兩個(gè)特別乖巧的孩子,付愛寶的孩...
    ef19cd0c10f7閱讀 210評(píng)論 0 0
  • 要優(yōu)先使用基本類型而不是裝箱基本類型,要當(dāng)心無意識(shí)的自動(dòng)裝箱。 檢查參數(shù)的有效性 不要過去追求提供便利的方法,除非...
    cammsia閱讀 186評(píng)論 0 0

友情鏈接更多精彩內(nèi)容