mysql中取隨機資料

2021-07-25 03:03:07 字數 2098 閱讀 1408

rand在手冊裡是這麼說的:

rand()

rand(n)

例**如下

複製**

select * from table_name order by rand() limit 5;

返回在範圍0到1.0內的隨機浮點值。如果乙個整數引數n被指定,它被用作種子值。

**如下

複製**

mysql> select rand(); 

-> 0.5925 

mysql> select rand(20); 

-> 0.1811 

mysql> select rand(20); 

-> 0.1811 

mysql> select rand(); 

-> 0.2079 

mysql> select rand(); 

-> 0.7888

你不能在乙個order by子句用rand()值使用列,因為order by將重複計算列多次。然而在mysql3.23中,你可以做: select * from table_name order by rand(),這是有利於得到乙個來自select * from table1,table2 where a=b and c的集合的隨機樣本。注意在乙個where子句裡的乙個rand()將在每次where被執行時重新評估。

取出隨機資料效能優化

從上面的資料中我感覺資料量小肯定沒有問題大了肯定就不行了,我乙個5w記錄資料表隨機讀取就要10秒了,太慢了。

如果這樣在資料量大時就掛了 後來找到乙個辦法

**如下

複製**

select * from table_name as r1 join (select round(rand() * (select max(id) from table_name)) as id) as

r2 where r1.id >= r2.id order by r1.id asc limit 5;

花時間0.02 sec

上面的語句採用的是join,mysql的論壇上有人使用

**如下

複製**

select * 

from `table` 

where id >= (select floor( max(id) * rand()) from `table` ) 

order by id limit 1;

我測試了一下,需要0.5秒,速度也不錯,但是跟上面的語句還是有很大差距。總覺有什麼地方不正常。

於是我把語句改寫了一下。

**如下

複製**

select * from `table` 

where id >= (select floor(rand() * (select max(id) from `table`)))  

order by id limit 1;

這下,效率又提高了,查詢時間只有0.01秒

最後,再把語句完善一下,加上min(id)的判斷。我在最開始測試的時候,就是因為沒有加上min(id)的判斷,結果有

一半的時間總是查詢到表中的前面幾行。

完整查詢語句是:

**如下

複製**

select * from `table` 

where id >= (select floor( rand() * ((select max(id) from `table`)-(select min(id) from `table`)) +

(select min(id) from `table`)))  order by id limit 1;

select * 

from `table` as t1 join (select round(rand() * ((select max(id) from `table`)-(select min(id) from

`table`))+(select min(id) from `table`)) as id) as t2 

where t1.id >= t2.id 

order by t1.id limit 1;

最後在php中對這兩個語句進行分別查詢10次,

前者花費時間 0.147433 秒

後者花費時間 0.015130 秒

mysql 取隨機編號 mysql取隨機資料的方法

先看手冊中的sql select from table name order by rand limit 5 描述 rand rand n 返回在範圍0到1.0內的隨機浮點值。如果乙個整數引數n被指定,它被用作種子值。mysql select rand 0.5925 mysql select ran...

MySQL中如何取隨機數

現在,假設需要產生234到5678之間的隨機整數,mysql下怎麼實現。我們無法改mysql下rand的產生值,但我們可以改變我們的需求,1 我們需要最小是234,最大是5678,rand產生的最小是0,最大是1,我們需求的數減去234看看?最小數234 234 0,最大數5678 234 5444...

在Oracle 中取隨機數

1 從表中隨機取記錄 select from select from staff order bydbms random.random where rownum 4 表示從staff表中隨機取3條記錄 2 產生隨機數 select dbms random.random from dual 產生乙個任...