mysql亂數取列-比order by RAND()快5倍!
一般網站常會用到隨機或亂數取值,比方這樣的功能:隨選文章、亂數廣告、隨機推薦會員等。而就程式面來看就是要在資料庫中,任意取10個或N個資料列出來使用。
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.