從MySQL隨機選取資料

2021-09-08 13:11:21 字數 2028 閱讀 8573

--從mysql隨機選取資料

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

從mysql隨機選取資料最簡單的辦法就是使用」order by rand()」;

方案一:

select

*from `table` order

byrand() limit 0,1;

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

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

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

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

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

方案二:

$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以後我們可以使用子子查詢合併上面兩個方法:

方案四:

select

*from `table` where id >= (select

floor( max(id) *

rand()) from `table` ) order

by id limit 1;

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

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

方案三勝出!

MySQL隨機選取資料

本文實現了mysql的隨機數 mysq隨機選取資料 mysq隨機查詢資料 mysq隨機更新資料。mysq隨機查詢資料 以前在群裡討論過這個問題,比較的有意思.mysql的語法真好玩.他們原來都想用php的實現隨機,但取出多條好像要進行兩次以上查詢.翻了手冊,找到了下面這個語句,可以完成任務了。sel...

海量資料隨機選取

更詳細的大神部落格 問題1 在不知道檔案總行數的情況下,如何從檔案中隨機的抽取一行,並且每行被抽中的概率相等?問題2 在不知道檔案總行數的情況下,如何從檔案中隨機的抽取 k 行,並且每行被抽中的概率相等?問題一 抽取一行 在知道檔案行數的情況下,直接用 rand 函式就可以 不知道檔案行數的時候,我...

mysql列表隨機選資料 從MySQL隨機選取資料

從mysql隨機選取資料 2014 06 23 從mysql隨機選取資料最簡單的辦法就是使用 order by rand 方案一 select from table order by rand limit 0,1 這種方法的問題就是非常慢。原因是因為mysql會建立一張零時表來儲存所有的結果集,然後...