一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - MYSQL 隨機 抽取實現方法及效率分析

MYSQL 隨機 抽取實現方法及效率分析

2019-10-27 16:17mysql教程網 Mysql

MYSQL的隨機抽取實現方法。舉個例子,要從tablename表中隨機提取一條記錄,大家一般的寫法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。

代碼如下:


請教怎么從數據庫隨機讀出15條記錄? 
order by rand() limit 0,15 
怎么從數據庫隨機讀出所有記錄? 
order by rand() 


但是,后來我查了一下MYSQL的官方手冊,里面針對RAND()的提示大概意思就是,在ORDER BY從句里面不能使用RAND()函數,因為這樣會導致數據列被多次掃描。但是在MYSQL 3.23版本中,仍然可以通過ORDER BY RAND()來實現隨機。 

但是真正測試一下才發現這樣效率非常低。一個15萬余條的庫,查詢5條數據,居然要8秒以上。查看官方手冊,也說rand()放在ORDER BY 子句中會被執行多次,自然效率及很低。 
You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times. 
搜索Google,網上基本上都是查詢max(id) * rand()來隨機獲取數據。 
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; 

但是這樣會產生連續的5條記錄。解決辦法只能是每次查詢一條,查詢5次。即便如此也值得,因為15萬條的表,查詢只需要0.01秒不到。 

下面的語句采用的是JOIN,mysql的論壇上有人使用 
SELECT * 
FROM `table` 
WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) 
ORDER BY id LIMIT 1; 

我測試了一下,需要0.5秒,速度也不錯,但是跟上面的語句還是有很大差距。總覺有什么地方不正常。 

于是我把語句改寫了一下。 
SELECT * FROM `table` 
WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`))) 
ORDER BY id LIMIT 1; 

這下,效率又提高了,查詢時間只有0.01秒 

最后,再把語句完善一下,加上MIN(id)的判斷。我在最開始測試的時候,就是因為沒有加上MIN(id)的判斷,結果有一半的時間總是查詢到表中的前面幾行。 
完整查詢語句是: 
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中對這兩個語句進行分別查詢10次, 
前者花費時間 0.147433 秒 
后者花費時間 0.015130 秒 
看來采用JOIN的語法比直接在WHERE中使用函數效率還要高很多。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 色综合天天综合 | 99热精品久久 | 国内老司机精品视频在线播出 | 精品久久99麻豆蜜桃666 | 色综合综合色 | www.四虎在线| 99热久久这里只精品国产www | 91视频国产精品 | 2020韩国三级理论在线观看 | 草莓绿巨人香蕉茄子芭乐 | 亚洲情欲网| 双性np玩烂了np欲之国的太子 | 门房秦大爷最新章节阅读 | 日韩激情视频在线观看 | 亚洲国产网址 | 亚洲国产在线视频中文字 | 岛国在线播放v片免费 | 99久久999久久久综合精品涩 | 亚洲欧洲网站 | 91传媒制片厂制作传媒破解版 | 国产午夜精品一区二区三区不卡 | 96免费精品视频在线 | 国产馆| 操破苍穹全文阅读 | 成人国产一区二区 | 91九色麻豆 | 国产成人亚洲影视在线 | 亚洲www视频 | 国产日产精品久久久久快鸭 | 国产亚洲精品九九久在线观看 | 玩两个少妇女邻居 | blackedhd 18sex| les女同h高h喷水 | 久久99re2热在线播放7 | 精品国产91久久久久久久a | 无限在线观看视频大全免费高清 | 亚洲精品中文字幕第一区 | chinesexxxxhd人妖 chinesespanking调教 | 午夜爱| 亚洲国产精品成人久久 | 欧美日韩国产在线人成dvd |