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