千萬不要 ORDER BY RAND

2021-09-29 07:43:42 字數 1947 閱讀 2230

由於需要大概研究了一下mysql的隨機抽取實現方法。如:要從tablename表中隨機提取一條記錄,大家一般的寫法就是:select * from tablename order by rand() limit 1。

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

但是真正測試一下才發現這樣效率非常低。乙個15萬餘條的庫,查詢5條資料,居然要8秒以上。檢視官方手冊,也說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 * fromtableas t1 join (select round(rand() * (select max(id) fromtable)) as id) as t2

where t1.id >= t2.id

order by t1.id asc limit 5;

但是這樣會產生連續的5條記錄。解決辦法只能是每次查詢一條,查詢5次。即便如此也值得,因為15萬條的表,查詢只需要0.01秒不到。

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

select *

fromtable

where id >= (select floor( max(id) * rand()) fromtable)

order by id limit 1;

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

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

select * fromtable

where id >= (select floor(rand() * (select max(id) fromtable)))

order by id limit 1;

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

最後,再把語句完善一下,加上min(id)的判斷。我在最開始測試的時候,就是因為沒有加上min(id)的判斷,結果有一半的時間總是查詢到表中的前面幾行。

完整查詢語句是:

select * fromtable

where id >= (select floor( rand() * ((select max(id) fromtable)-(select min(id) fromtable)) + (select min(id) fromtable)))

order by id limit 1;

select * fromtableas t1 join (select round(rand() * ((select max(id) fromtable)-(select min(id) fromtable))+(select min(id) fromtable)) as id) as t2

where t1.id >= t2.id

order by t1.id limit 1;

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

前者花費時間 0.147433 秒

後者花費時間 0.015130 秒

看來採用join的語法比直接在where中使用函式效率還要高很多

千萬不要甘於平庸

也許你會成為世界上最偉大的鋼琴家,也許你會成為世界上最傑出的繪畫大師,也許你會成為世界上最優秀的程式設計師.千萬不要認為這一切 世界上最 的字眼與你無關.因為只有認為這些字眼與自己有關的人,才有機會成為 世界上最 的人.但是現實世界中,最 的人總是只有乙個,有太多人被這種競爭磨平了自己的意志,磨去了...

千萬不要學程式設計!

今天我在csdn博文中,不講技術,不講技術,不講技術!重要的事情說三遍!我要說的是,千萬別學程式設計,為什麼說 千萬不要學程式設計 呢?我們可以先反過來討論 我們為什麼要學程式設計?這個問題討論清楚了,你也就明白我為什麼說千萬不要學程式設計了!學習程式設計應該是這樣的邏輯嗎?在討論為什要學程式設計這...

千萬不要相信客戶的話

今天徒弟突然發飛信給我,截圖如下 我們在維護永和豆漿的收銀系統,當徒弟發給我這個訊息的時候,我的第乙個想法就是,資料庫千萬別弄沒了。我趕緊過去通過qq遠端他們的電腦,找了一圈沒有找到資料庫檔案。然後我就問客戶為什麼沒有和我們說一下就重灌系統,並且資料庫檔案並不在系統盤,怎麼會沒了呢?客戶說是孩子玩兒...