天天看點

mysql 随機取幾萬資料,mysql随機取資料的幾種方法

摘要 騰興網為您分享:mysql随機取資料的幾種方法,周公解夢,小t智聯,圖樂,千題庫等軟體知識,以及2018酷狗音樂vip,集裝箱之家,兄弟3150驅動,聽書,熊貓辦公,四年級上冊國文書,winmail郵件伺服器,閃之軌迹3dm,小豬佩奇塗色,同籌網,本色,td1,長春市圖書館,世紀開元,工商管理自我鑒定等軟體it資訊,歡迎關注騰興網。mysql随機選取資料的最常用的就是:ORDER BY RAND()。 方法1: SELECT * FROM `table` ORDER BY RAND() LIMIT 0,1; 此方法會比較慢,在于mysql會建立一張零時表來儲存所有的結果集,然後給每個結果一個...

mysql随機選取資料的最常用的就是:ORDER BY RAND()。

方法1:

SELECT * FROM `table` ORDER BY RAND() LIMIT 0,1;

此方法會比較慢,在于mysql會建立一張零時表來儲存所有的結果集,然後給每個結果一個随機索引,然後再排序并傳回。

有方法可以讓執行速度更快,基本思想就是先擷取一個随機數,然後使用這個随機數來擷取指定的行。

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

為了擷取整張表的最小和最大id,我們使用MAX()和MIN()兩個聚合函數。這兩個方法會傳回指定組裡的最大和最小值。在這裡這個組就是我們表裡的所有id字段值。

方法2:

$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 ");

這個方法會用唯一的id值限制表的每一行。

那麼,如果不是這樣情況怎麼辦?

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

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

代碼如下:

$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 " );

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

方法4:

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

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

尋找随機數選取的不同方法,根本目的在于提高速度,那麼同等軟硬條件下:

最慢的是解決方法一(假定它用了100%的時間)。

方法二用了79%

方法三 - 13%

方法四 - 16%

由此可見,最快的是方法3.