mysql隨機獲取記錄

2021-09-01 14:20:40 字數 1279 閱讀 7417

[size=medium]mysql的隨機抽取實現方法。舉個例子,要從tablename表中隨機提取一條記錄,大家一般的寫法就是:select * from tablename order by rand() limit 1

但是,後來我查了一下mysql的官方手冊,裡面針對rand()的提示大概意思就是,在order by從句裡面不能使用rand()函式,因為這樣會導致資料列被多次掃瞄。但是在mysql 3.23版本中,仍然可以通過order by rand()來實現隨機。

但是真正測試一下才發現這樣效率非常低。乙個100萬餘條的庫,查詢1條資料,居然要4秒以上。檢視官方手冊,也說rand()放在order by 子句中會被執行多次,自然效率及很低。

you cannot use a column with rand() values in an order by clause, because order by would evaluate the column multiple times.

搜尋google,網上基本上都是查詢max(id) * rand()來隨機獲取資料。

select * from instanceprice_attach where id <= (select floor(rand() * (select max(id) from instanceprice_attach))) order by id limit 1

這樣大概95ms。

原來寫的是》=,一直是id最大的那條記錄。

有人這樣處理取得重覆記錄:

select t1.*

from tablename as t1 join

(select round(rand() * ((select max(id) from tablename )-(select min(id) from tablename ))+

(select min(id) from tablename)) as id) as t2

where t1.id >= t2.id

order by t1.id limit 1;

select * from tablename

where id >= (select floor( rand() * ((select max(id) from tablename )-

(select min(id) from tablename )) + (select min(id) from tablename )))

order by id limit 1;

大概都是90多毫秒,網上說第一種寫法會快一點,但是我測試貌似沒什麼區別。[/size]

mysql隨機獲取記錄

mysql隨機獲取記錄 mysql的隨機抽取實現方法。舉個例子,要從tablename表中隨機提取一條記錄,大家一般的寫法就是 select from tablename order by rand limit 1 但是,後來我查了一下mysql的官方手冊,裡面針對rand 的提示大概意思就是,在o...

Oracle獲取隨機記錄

最近在做乙個小的考試系統,需要用到隨機抽取題目,於是就從網上搜到如下方法 1.dbms random包 select from select from tablename order by dbms random.value where rownum n 注 dbms random包需要手工安裝,位...

mysql隨機顯示記錄 MySQL隨機讀取表中記錄

order by rand 來實現 select from table order by rand 記憶體臨時表 order by rand 是一般通過記憶體臨時表排序,可以通過執行計畫explain中extra欄位顯示using temporary觀察到。由於是記憶體排序,回表過程不涉及機械磁碟i...