mysql隨機取數據,如何實現高效率?

從數據庫中(mysql)隨機獲取幾條數據很簡單,可是若是一個表的數據基數很大,好比一千萬,從一千萬中隨機產生10條數據,那就至關慢了,若是同時一百我的訪問網站,處理這些個進程,對於通常的服務器來講,確定是要死機的。 mysql

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

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

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

        本文由PHP樂知博客提供 http://tech.42xiu.com 函數

相關文章
相關標籤/搜索