<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
        主站蜘蛛池模板: 亚洲免费精彩视频在线观看| 黄人成a动漫片免费网站| 叮咚影视在线观看免费完整版| 国产精品冒白浆免费视频| 亚洲中文字幕无码av| 国内免费高清在线观看| 亚洲综合色区中文字幕| 免费精品国偷自产在线在线 | 亚洲国产精品免费在线观看| 亚洲Av综合色区无码专区桃色| 国产精品永久免费| 亚洲国产综合无码一区| 免费无码作爱视频| 亚洲精品白色在线发布| 在线视频免费观看高清| 亚洲日韩中文字幕一区| 国产一级一片免费播放i| 一级做性色a爰片久久毛片免费| 中文字幕中韩乱码亚洲大片| a毛看片免费观看视频| 色噜噜综合亚洲av中文无码| free哆啪啪免费永久| 亚洲乱妇熟女爽到高潮的片| 国产免费久久精品久久久| 精品一区二区三区高清免费观看 | 在线看片免费人成视频久网下载| 亚洲国产精品VA在线观看麻豆| 久久国产乱子伦精品免费强| 亚洲一卡二卡三卡四卡无卡麻豆| 永久久久免费浮力影院| 久久99久久成人免费播放| 亚洲尹人九九大色香蕉网站 | 四虎必出精品亚洲高清| 国产一级做a爱免费视频| 国产一精品一AV一免费| 精品亚洲成在人线AV无码| 亚洲国产精品无码久久青草| 99re在线视频免费观看| 粉色视频免费入口| 久久亚洲精品国产精品| 又粗又硬免费毛片|