mysql 随机查询数据
生活随笔
收集整理的這篇文章主要介紹了
mysql 随机查询数据
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
在mysql中查詢5條不重復(fù)的數(shù)據(jù),使用以下:
1 SELECT * FROM `table` ORDER BY RAND() LIMIT 5??就可以了。但是真正測試一下才發(fā)現(xiàn)這樣效率非常低。一個(gè)15萬余條的庫,查詢5條數(shù)據(jù),居然要8秒以上?
搜索Google,網(wǎng)上基本上都是查詢max(id) * rand()來隨機(jī)獲取數(shù)據(jù)。?
1 SELECT *??
2 FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2??
3 WHERE t1.id >= t2.id??
4 ORDER BY t1.id ASC LIMIT 5;?
??
但是這樣會(huì)產(chǎn)生連續(xù)的5條記錄。解決辦法只能是每次查詢一條,查詢5次。即便如此也值得,因?yàn)?5萬條的表,查詢只需要0.01秒不到。?
上面的語句采用的是JOIN,mysql的論壇上有人使用?
1 SELECT *??
2 FROM `table`??
3 WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` )??
4 ORDER BY id LIMIT 1;?
??
我測試了一下,需要0.5秒,速度也不錯(cuò),但是跟上面的語句還是有很大差距。總覺有什么地方不正常。?
于是我把語句改寫了一下。?
1 SELECT * FROM `table`??
2 WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`))) ??
3 ORDER BY id LIMIT 1;?
??
這下,效率又提高了,查詢時(shí)間只有0.01秒?
最后,再把語句完善一下,加上MIN(id)的判斷。我在最開始測試的時(shí)候,就是因?yàn)闆]有加上MIN(id)的判斷,結(jié)果有一半的時(shí)間總是查詢到表中的前面幾行。?
完整查詢語句是:?
1 SELECT * FROM `table`??
2 WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECTMIN(id) FROM `table`))) ??
3 ORDER BY id LIMIT 1;?
4??
5 SELECT *??
6 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??
7 WHERE t1.id >= t2.id??
8 ORDER BY t1.id LIMIT 1;?
最后對(duì)這兩個(gè)語句進(jìn)行分別查詢10次,?
前者花費(fèi)時(shí)間 0.147433 秒?
后者花費(fèi)時(shí)間 0.015130 秒?
看來采用JOIN的語法比直接在WHERE中使用函數(shù)效率還要高很多。?
來自:http://blog.csdn.net/zxl315/article/details/2435368
瀏覽更多有關(guān)? mysql 隨機(jī)查詢的文章。?
ps:上面的查出來的數(shù)據(jù)是連續(xù)的,如果想要得到非連續(xù)數(shù)據(jù)則可以用如下方法:?
1. 能過EXISTS子查詢得到幾個(gè)隨機(jī)數(shù),再從中取得數(shù)據(jù)(不推薦,50W條數(shù)據(jù)耗時(shí)1秒多,只能說這是一種方法來參考)
?SELECT DISTINCT?
2 ? ? c.id, c.`name`, c.age, c.address?
3 FROM?
4 ? ? contact as c?
5 WHERE?
6 ? EXISTS (SELECT 1 FROM (SELECT??
7 ? ? ? ? ? ? ? ? ? ? ROUND(RAND() * (SELECT MAX(id) - MIN(id) FROM contact) + (SELECT MIN(id) FROM contact)) AS id??
8 ? ? ? ? ? ? ? ? from contact LIMIT 40) AS t1 WHERE t1.id = c.id)?
9 LIMIT 4;?
2. 通過JOIN來得到隨機(jī)數(shù)據(jù),50W條數(shù)據(jù)耗時(shí)0.001秒?
1 SELECT DISTINCT?
2 ? ? c.id, c.`name`, c.age, c.address?
3 FROM?
4 ? ? contact as c?
5 ? ? JOIN (SELECT ---www.jbxue.com?
6 ? ? ? ? ? ? ? ROUND(RAND() * (SELECT MAX(id) - MIN(id) FROM contact) + (SELECT MIN(id) FROM contact)) AS id??
7 ? ? ? ? ? FROM contact LIMIT 40) AS t2 ON c.id = t2.id?
8 LIMIT 4;?
轉(zhuǎn)載于:https://my.oschina.net/softsky/blog/177346
總結(jié)
以上是生活随笔為你收集整理的mysql 随机查询数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小小攻城师,步步达成梦想!
- 下一篇: MySQL查询in操作 查询结果按in集