mysql隨機獲取記錄

2021-12-30 10:07:31 字數 1310 閱讀 5178

mysql隨機獲取記錄

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

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

www.2cto.com  

但是真正測試一下才發現這樣效率非常低。乙個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多毫秒,網上說第一種寫法會快一點,但是我測試貌似沒什麼區別。

mysql隨機獲取記錄

size medium 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...