mysql亂數取列-比order by RAND()快5倍!

一般網站常會用到隨機或亂數取值,比方這樣的功能:隨選文章、亂數廣告、隨機推薦會員等。而就程式面來看就是要在資料庫中,任意取10個或N個資料列出來使用。
mysql亂數取列-比order by RAND()快5倍!' /></p>
<p>MySQL提供RAND()函式來達到這個目的,很方便,但是,效能非常差!所以有網友又提供了幾種不一樣的方法。以下四方法執行速度值越小越快:</p>
<p>方法1(執行速度100)</p>
<pre name= SELECT * FROM `table` ORDER BY RAND() LIMIT 0,10; 方法2(執行速度79)

$range_result = mysql_query( " SELECT MAX(`id`) AS max_id , MIN(`id`) AS min_id FROM `table` ");
$range_row = mysql_fetch_object( $range_result ); 
$random = mt_rand( $range_row->min_id , $range_row->max_id );
$result = mysql_query( " SELECT * FROM `table` WHERE `id` >= $random LIMIT 0,1 ");

方法3(執行速度13)

$offset_result = mysql_query( " SELECT FLOOR(RAND() * COUNT(*)) AS `offset` FROM `table` ");
$offset_row = mysql_fetch_object( $offset_result ); 
$offset = $offset_row->offset;
$result = mysql_query( " SELECT * FROM `table` LIMIT $offset, 1 " );

方法4(執行速度16)

SELECT * FROM `table` WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) ORDER BY id LIMIT 1;

後記:
我實際在有400筆資料的MySQL隨機取10列測試,方法一的執行速度約為0.0255秒,而方法四的速度約為0.0060秒

就速度上來說,方法2,3,4的確較方法1大幅提升,但如果看到這四個方法的結果,你會發現,方法1才是真正的亂數取值

大部份有寫過程式的人都能看出端倪(不贅述,看結果)
方法2,3,4的三次可能結果(以1~400筆資料,取5列為例):
53,54,55,56,57
100,101,102,103,105
378,379,380,381,382

方法1的三次可能結果:
32,105,87,389,48
209,65,182,98,338
27,68,265,128,111


資料來源(建議看看原文下方網友的留言討論):
Select random value from MySQL database table
Selecting random record from MySQL database table.

您可能也會喜歡…

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *