mysql 隨機函數 效率_MySQL 隨機函數獲取數據速度和效率分析

 2023-12-06 阅读 24 评论 0

摘要:在mysql中帶了隨機取數據的函數,在mysql中我們會有rand()函數,很多朋友都會直接使用,如果幾百條數據肯定沒事,如果幾萬或百萬時你會發現,直接使用是錯誤的。下面我來介紹隨機取數據一些優化方法。select * from table_name order by rand(

在mysql中帶了隨機取數據的函數,在mysql中我們會有rand()函數,很多朋友都會直接使用,如果幾百條數據肯定沒事,如果幾萬或百萬時你會發現,直接使用是錯誤的。下面我來介紹隨機取數據一些優化方法。

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

rand在手冊里是這么說的:

rand()

rand(n)

返回在范圍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

網上基本上都是查詢max(id) * rand()來隨機獲取數據。

select *

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

where t1.id >= t2.id

order by t1.id asc limit 5;

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

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

select *

from `table`

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

order by id limit 1;

我測試了一下,需要0.5秒,速度也不錯,但是跟上面的語句還是有很大差距

后來請教了baidu,得到如下代碼

完整查詢語句是:

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 秒

執行效率需要0.02 sec.可惜的是,只有mysql 4.1.*以上才支持這樣的子查詢.

注意事項 查看官方手冊,也說rand()放在order by 子句中會被執行多次,自然效率及很低。

以上的sql語句最后一條,本人實際測試通過,100w數據,瞬間出結果。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

希望與廣大網友互動??

點此進行留言吧!

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/188941.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息