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