mysql實現高效率隨機取數據


從數據庫中(mysql)隨機獲取幾條數據很簡單,但是如果一個表的數據基數很大,比如一千萬,從一千萬中隨機產生10條數據,那就相當慢了,如果同時一百個人訪問網站,處理這些個進程,對於一般的服務器來說,肯定是要死機的。

mysql數據庫獲取隨機數據的函數rand(),我建議輕易不要用這個,我寫博客的時候試了一下,從16萬數據里隨機獲取5條數據,用時14.02秒,這個耗費滿驚人的。

SELECT * FROM t_share ORDER BY rand() LIMIT 5;

通過mysql最大值函數max(),最小值min()來減小查詢消耗

因為mysql數據的最大值和最小值的獲取幾乎是0消耗的,數據庫表數據與自身主鍵ID的集合做join查詢,是非常快速的。剛我也試了一下,在16萬數據的基數下,隨機產生5條數據幾乎看不到時間消耗的。但是這種查詢方法有一個缺點,產生的數據ID都是連續的,如果想不連續,還要做循環執行才行(每循環一次隨機1條或2條數據)。

SELECT sh1.* FROM fw_share AS sh1 
JOIN 
(SELECT 
	ROUND(
		RAND() * ((SELECT MAX(share_id) FROM fw_share)-(SELECT MIN(share_id) FROM fw_share)) 
		+ (SELECT MIN(share_id) FROM fw_share)
	) AS share_id
) AS sh2 
WHERE sh1.share_id>=sh2.share_id

其實隨機產生數據,完全可以讓他有根據的隨機產生。這怎么講?比如一篇文章,它有標題、標簽、內容,可以提取權重很高的關鍵詞,沒篇文章都這么處理,用搜索引擎倒排序的方法,可以快速找到相同關鍵詞的一類文章,然后在這些文章里,隨機產生幾條數據就是了。把大海撈針的活,變成了在浴池里撈個雜物,從大的范圍,縮小到能掌控的范圍,萬事就變得簡單啦!這也是一種思路,找不到很好的解決辦法時,可以試試。

轉自:http://my.oschina.net/sharephper/blog/100104


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM