從MySQL隨機選取資料

來源:互聯網
上載者:User

標籤:style   class   blog   http   tar   color   

--從MySQL隨機選取資料

-------------------------2014/06/23

 

從MySQL隨機選取資料最簡單的辦法就是使用”ORDER BY RAND()”;

方案一:

[php] view plaincopy 
  1. SELECT * FROM `table` ORDER BY RAND() LIMIT 0,1;  


這種方法的問題就是非常慢。原因是因為MySQL會建立一張零時表來儲存所有的結果集,然後給每個結果一個隨機索引,然後再排序並返回。

有幾個方法可以讓它快起來。

基本思想就是先擷取一個隨機數,然後使用這個隨機數來擷取指定的行。

由於所有的行都有一個唯一的id,我們將只取最小和最大id之間的隨機數,然後擷取id為這個數行。為了讓這個方法當id不連續時也能有效,我們在最終的查詢裡使用”>=”代替”=”。

為了擷取整張表的最小和最大id,我們使用MAX()和MIN()兩個彙總函式。這兩個方法會返回指定組裡的最大和最小值。在這裡這個組就是我們表裡的所有id欄位值。

方案二:

[php] view plaincopy 
  1. $range_result = mysql_query( " SELECT MAX(`id`) AS max_id , MIN(`id`) AS min_id FROM `table` ");  
  2. $range_row = mysql_fetch_object( $range_result );  
  3. $random = mt_rand( $range_row->min_id , $range_row->max_id );  
  4. $result = mysql_query( " SELECT * FROM `table` WHERE `id` >= $random LIMIT 0,1 ");   


就像我們剛才提到的,這個方法會用唯一的id值限制表的每一行。那麼,如果不是這樣情況怎麼辦?

下面這個方案是使用了MySQL的LIMIT子句。LIMIT接收兩個參數值。第一個參數指定了返回結果第一行的位移量,第二個參數指定了返回結果的最大行數。位移量指定第一行是0而不是1。

為了計算第一行的位移量,我們使用MySQL的RAND()方法從0到1之間產生一個隨機數。然後我們把這個數字跟我們用COUNT()方法擷取倒的表記錄數相乘。由於LIMIT的參數必須是int型而不能是float,我們使用FLOOR()來處理結果。FLOOR()會計算小於運算式的最大值。最終的代碼就是這樣:

方案三:

[php] view plaincopy 
  1. $offset_result = mysql_query( " SELECT FLOOR(RAND() * COUNT(*)) AS `offset` FROM `table` ");  
  2. $offset_row = mysql_fetch_object( $offset_result );  
  3. $offset = $offset_row->offset;  
  4. $result = mysql_query( " SELECT * FROM `table` LIMIT $offset, 1 " );  


在MySQL 4.1以後我們可以使用子子查詢合并上面兩個方法:

方案四:

[php] view plaincopy 
  1. SELECT * FROM `table` WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) ORDER BY id LIMIT 1;  


這個方案跟方案二有同樣的弱點,只對有唯一id值的表有效。

記住我們最初尋找選擇隨機行的替代方法的原因,速度!所以,這些方案的在執行時間上的比較會怎麼樣?我不會指出硬體和軟體配置或者給出具體的數字。大概的結果是這樣的:

  • 最慢的是解決方案一(我們假定它用了100%的時間)。
  • 方案二用了79%
  • 方案三 - 13%
  • 方案四 - 16%

方案三勝出!

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.