国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫(kù)技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫(kù) - Mysql - MYSQL 隨機(jī) 抽取實(shí)現(xiàn)方法及效率分析

MYSQL 隨機(jī) 抽取實(shí)現(xiàn)方法及效率分析

2019-10-27 16:17mysql教程網(wǎng) Mysql

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

代碼如下:


請(qǐng)教怎么從數(shù)據(jù)庫(kù)隨機(jī)讀出15條記錄? 
order by rand() limit 0,15 
怎么從數(shù)據(jù)庫(kù)隨機(jī)讀出所有記錄? 
order by rand() 


但是,后來(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ǔ)句改寫了一下。 
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ù)效率還要高很多。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 一区日韩 | 五月婷婷网站 | 久久久久av| 亚洲欧美激情精品一区二区 | 免费一级毛片在线播放放视频 | 国产一区二区三区欧美 | 福利视频三区 | 欧美日韩中文字幕在线 | 欧美一区二区三区在线 | 午夜精品久久久久久久久久久久 | 欧美在线观看免费观看视频 | 欧美在线亚洲 | 一区二区在线 | 国产亚洲精品美女久久久久久久久久 | 久久久www免费人成精品 | 韩日一区| 欧美成人综合在线 | 成人教育av | 欧美日韩一区二区三区不卡视频 | 日韩精品av一区二区三区 | 亚洲精品午夜 | 日本黄色一级电影 | 在线永久免费观看日韩a | 黄色网毛片 | 成人免费观看49www在线观看 | 日韩国产| 亚洲一区在线视频 | a级性生活片 | 国产美女自拍视频 | 超级av | 欧美乱大交xxxxx春色视频 | 午夜寂寞少妇aaa片毛片 | 久久爱电影 | 黄色一级片一级片 | 91欧美激情一区二区三区成人 | 亚洲欧美精品一区二区三区 | 国产精品久久久久久久久久免费看 | 亚洲黄色高清 | 黄片毛片免费观看 | 四虎欧美 | 成人午夜精品久久久久久久3d |