国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

MySQL Order By Rand()效率分析

2024-07-24 12:49:09
字體:
供稿:網(wǎng)友
最近由于需要大概研究了一下MYSQL的隨機(jī)抽取實(shí)現(xiàn)方法。舉個例子,要從tablename表中隨機(jī)提取一條記錄,大家一般的寫法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。

但是,后來我查了一下MYSQL的官方手冊,里面針對RAND()的提示大概意思就是,在ORDER BY從句里面不能使用RAND()函數(shù),因?yàn)檫@樣會導(dǎo)致數(shù)據(jù)列被多次掃描。但是在MYSQL 3.23版本中,仍然可以通過ORDER BY RAND()來實(shí)現(xiàn)隨機(jī)。

但是真正測試一下才發(fā)現(xiàn)這樣效率非常低。一個15萬余條的庫,查詢5條數(shù)據(jù),居然要8秒以上。查看官方手冊,也說rand()放在ORDER BY 子句中會被執(zhí)行多次,自然效率及很低。
You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times.
搜索Google,網(wǎng)上基本上都是查詢max(id) * rand()來隨機(jī)獲取數(shù)據(jù)。
復(fù)制代碼 代碼如下:

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;

但是這樣會產(chǎn)生連續(xù)的5條記錄。解決辦法只能是每次查詢一條,查詢5次。即便如此也值得,因?yàn)?5萬條的表,查詢只需要0.01秒不到。

下面的語句采用的是JOIN,mysql的論壇上有人使用
復(fù)制代碼 代碼如下:

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)的判斷。我在最開始測試的時候,就是因?yàn)闆]有加上MIN(id)的判斷,結(jié)果有一半的時間總是查詢到表中的前面幾行。
完整查詢語句是:
復(fù)制代碼 代碼如下:

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;

復(fù)制代碼 代碼如下:

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中對這兩個語句進(jìn)行分別查詢10次,
前者花費(fèi)時間 0.147433 秒
后者花費(fèi)時間 0.015130 秒
看來采用JOIN的語法比直接在WHERE中使用函數(shù)效率還要高很多。

您可能感興趣的文章:

MySQL的指定范圍隨機(jī)數(shù)函數(shù)rand()的使用技巧mysql 某字段插入隨機(jī)數(shù)(插入隨機(jī)數(shù)到MySQL數(shù)據(jù)庫)MySQL查詢隨機(jī)數(shù)據(jù)的4種方法和性能對比mysql獲取隨機(jī)數(shù)據(jù)的方法mysql優(yōu)化取隨機(jī)數(shù)據(jù)慢的方法MySQL取出隨機(jī)數(shù)據(jù)從MySQL數(shù)據(jù)庫表中取出隨機(jī)數(shù)據(jù)的代碼MySQL中的RAND()函數(shù)使用詳解MySQL下的RAND()優(yōu)化案例分析MySQL優(yōu)化之對RAND()的優(yōu)化方法mysql中RAND()隨便查詢記錄效率問題和解決辦法分享MYSQL隨機(jī)抽取查詢 MySQL Order By Rand()效率問題php 隨機(jī)記錄mysql rand()造成CPU 100%的解決辦法MySQL rand函數(shù)實(shí)現(xiàn)隨機(jī)數(shù)的方法
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 裕民县| 全椒县| 容城县| 大宁县| 巴林右旗| 嘉峪关市| 莱州市| 连州市| 丰原市| 福海县| 丽江市| 桐梓县| 轮台县| 嵊泗县| 喜德县| 鄂托克旗| 正镶白旗| 静海县| 凤翔县| 尼木县| 绵竹市| 曲水县| 平果县| 探索| 湘潭县| 长沙县| 穆棱市| 全南县| 商南县| 商丘市| 本溪| 宜章县| 开江县| 枝江市| 双柏县| 连云港市| 华蓥市| 崇文区| 古丈县| 南陵县| 深州市|