<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
        當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

        MySQL的OrderByRand()有很嚴(yán)重的效率問(wèn)題

        來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-09 13:36:57
        文檔

        MySQL的OrderByRand()有很嚴(yán)重的效率問(wèn)題

        MySQL的OrderByRand()有很嚴(yán)重的效率問(wèn)題:MySQL很多時(shí)候需要獲取隨機(jī)數(shù)據(jù),舉個(gè)例子,要從tablename表中隨機(jī)提取一條記錄,大家一般的寫(xiě)法就是: SELECT * FROM tablename ORDER BY RAND() LIMIT 1 但是,后來(lái)我查了一下MYSQL的官方手冊(cè),里面針對(duì)RAND()的提示大概意思就是,在ORDER BY
        推薦度:
        導(dǎo)讀MySQL的OrderByRand()有很嚴(yán)重的效率問(wèn)題:MySQL很多時(shí)候需要獲取隨機(jī)數(shù)據(jù),舉個(gè)例子,要從tablename表中隨機(jī)提取一條記錄,大家一般的寫(xiě)法就是: SELECT * FROM tablename ORDER BY RAND() LIMIT 1 但是,后來(lái)我查了一下MYSQL的官方手冊(cè),里面針對(duì)RAND()的提示大概意思就是,在ORDER BY

        MySQL很多時(shí)候需要獲取隨機(jī)數(shù)據(jù),舉個(gè)例子,要從tablename表中隨機(jī)提取一條記錄,大家一般的寫(xiě)法就是: SELECT * FROM tablename ORDER BY RAND() LIMIT 1 但是,后來(lái)我查了一下MYSQL的官方手冊(cè),里面針對(duì)RAND()的提示大概意思就是,在ORDER BY從句里面不能

        MySQL很多時(shí)候需要獲取隨機(jī)數(shù)據(jù),舉個(gè)例子,要從tablename表中隨機(jī)提取一條記錄,大家一般的寫(xiě)法就是:

        SELECT * FROM tablename ORDER BY RAND() LIMIT 1
        

        但是,后來(lái)我查了一下MYSQL的官方手冊(cè),里面針對(duì)RAND()的提示大概意思就是,在ORDER BY從句里面不能使用RAND()函數(shù),因?yàn)檫@樣會(huì)導(dǎo)致數(shù)據(jù)列被多次掃描。但是在MYSQL 3.23版本中,仍然可以通過(guò)ORDER BY RAND()來(lái)實(shí)現(xiàn)隨機(jī)。

        測(cè)試一下才發(fā)現(xiàn)這樣效率非常低。一個(gè)15萬(wàn)余條的庫(kù),查詢5條數(shù)據(jù),居然要8秒以上。查看官方手冊(cè),也說(shuō)rand()放在ORDER BY 子句中會(huì)被執(zhí)行多次,自然效率及很低。You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times.

        搜索Google,網(wǎng)上基本上都是查詢max(id) * rand()來(lái)隨機(jī)獲取數(shù)據(jù)。

        SELECT *
        FROM 'table' AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM 'table')) AS id) AS t2
        WHERE t1.id >= t2.id
        ORDER BY t1.id ASC LIMIT 5;
        

        但是這樣會(huì)產(chǎn)生連續(xù)的5條記錄。解決辦法只能是每次查詢一條,查詢5次。即便如此也值得,因?yàn)?5萬(wàn)條的表,查詢只需要0.01秒不到。

        下面的語(yǔ)句采用的是JOIN,mysql的論壇上有人使用:

        SELECT *
        FROM 'table'
        WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM 'table' )
        ORDER BY id LIMIT 1;
        

        我測(cè)試了一下,需要0.5秒,速度也不錯(cuò),但是跟上面的語(yǔ)句還是有很大差距。總覺(jué)有什么地方不正常。

        于是我把語(yǔ)句改寫(xiě)了一下。

        SELECT * FROM 'table'
        WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM 'table'))) 
        ORDER BY id LIMIT 1;
        

        這下,效率又提高了,查詢時(shí)間只有0.01秒。

        最后,再把語(yǔ)句完善一下,加上MIN(id)的判斷。我在最開(kāi)始測(cè)試的時(shí)候,就是因?yàn)闆](méi)有加上MIN(id)的判斷,結(jié)果有一半的時(shí)間總是查詢到表中的前面幾行。

        完整查詢語(yǔ)句是:

        SELECT * FROM 'table'
        WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM 'table')-(SELECT MIN(id) FROM 'table')) + (SELECT MIN(id) FROM 'table'))) 
        ORDER BY id LIMIT 1;
        
        SELECT *
        FROM 'table' AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM 'table')-(SELECT MIN(id) FROM 'table'))+(SELECT MIN(id) FROM 'table')) AS id) AS t2
        WHERE t1.id >= t2.id
        ORDER BY t1.id LIMIT 1;
        

        最后在php中對(duì)這兩個(gè)語(yǔ)句進(jìn)行分別查詢10次,前者花費(fèi)時(shí)間 0.147433 秒,后者花費(fèi)時(shí)間 0.015130 秒。看來(lái)采用JOIN的語(yǔ)法比直接在WHERE中使用函數(shù)效率還要高很多。

        聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        MySQL的OrderByRand()有很嚴(yán)重的效率問(wèn)題

        MySQL的OrderByRand()有很嚴(yán)重的效率問(wèn)題:MySQL很多時(shí)候需要獲取隨機(jī)數(shù)據(jù),舉個(gè)例子,要從tablename表中隨機(jī)提取一條記錄,大家一般的寫(xiě)法就是: SELECT * FROM tablename ORDER BY RAND() LIMIT 1 但是,后來(lái)我查了一下MYSQL的官方手冊(cè),里面針對(duì)RAND()的提示大概意思就是,在ORDER BY
        推薦度:
        標(biāo)簽: 效率 問(wèn)題 mysql
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 国产精品日本亚洲777| 亚洲综合精品第一页| 久久er国产精品免费观看8| 免费一级毛片清高播放| 看成年女人免费午夜视频| 国产成人免费ā片在线观看| 日本系列1页亚洲系列| 青青青国产色视频在线观看国产亚洲欧洲国产综合 | 亚洲精品97久久中文字幕无码| 深夜a级毛片免费视频| 国产亚洲成归v人片在线观看| 亚洲视频在线免费| 久久久久亚洲av无码专区蜜芽| 免费国产叼嘿视频大全网站| 久久亚洲私人国产精品vA| 黄色网址免费观看| 亚洲av综合日韩| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 亚洲男人第一无码aⅴ网站| 91视频免费观看高清观看完整| 亚洲国产精品无码av| 日本一卡精品视频免费| 久久精品国产亚洲αv忘忧草 | 一级女人18毛片免费| 午夜在线亚洲男人午在线| 亚洲中文字幕无码中文字在线| 8x网站免费入口在线观看| 亚洲乱码无人区卡1卡2卡3| 亚洲电影日韩精品| 91青青国产在线观看免费| 亚洲精品无码日韩国产不卡av| 国产成人精品曰本亚洲79ren| 免费国产黄网站在线观看视频| 亚洲色大成网站www| 国产亚洲成AV人片在线观黄桃| 青青视频观看免费99| 色多多A级毛片免费看| 亚洲熟妇色自偷自拍另类| 亚洲国产成人VA在线观看| 99re免费视频| 国产亚洲精品免费|