久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

mysql數據庫查詢隨機數量條目的效率問題和解決方法

146次閱讀
沒有評論

共計 1509 個字符,預計需要花費 4 分鐘才能閱讀完成。

本篇內容介紹了“mysql 數據庫查詢隨機數量條目的效率問題和解決方法”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓丸趣 TV 小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

最近由于需要大概研究了一下 MYSQL 的隨機抽取實現方法。舉個例子,要從 tablename 表中隨機提取一條記錄,大家一般的寫法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。

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

但是真正測試一下才發(fā)現這樣效率非常低。一個 15 萬余條的庫,查詢 5 條數據,居然要 8 秒以上。查看官方手冊,也說 rand()放在 ORDER BY 子句中會被執(zhí)行多次,自然效率及很低。

搜索 Google,網上基本上都是查詢 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;

但是這樣會產生連續(xù)的 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 秒,速度也不錯,但是跟上面的語句還是有很大差距。總覺有什么地方不正常。

于是我把語句改寫了一下。
SELECT * FROM `table`
WHERE id = (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`))) 
ORDER BY id LIMIT 1;

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

最后,再把語句完善一下,加上 MIN(id)的判斷。我在最開始測試的時候,就是因為沒有加上 MIN(id)的判斷,結果有一半的時間總是查詢到表中的前面幾行。
完整查詢語句是:
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;

最后在中對這兩個語句進行分別查詢 10 次,
前者花費時間 0.147433 秒
后者花費時間 0.015130 秒
看來采用 JOIN 的語法比直接在 WHERE 中使用函數效率還要高很多。

“mysql 數據庫查詢隨機數量條目的效率問題和解決方法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注丸趣 TV 網站,丸趣 TV 小編將為大家輸出更多高質量的實用文章!

正文完
 
丸趣
版權聲明:本站原創(chuàng)文章,由 丸趣 2023-07-28發(fā)表,共計1509字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發(fā)布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 上饶县| 岐山县| 四会市| 通辽市| 乌拉特中旗| 潍坊市| 邵东县| 石狮市| 静安区| 全椒县| 朝阳县| 陈巴尔虎旗| 武邑县| 双柏县| 蒙阴县| 南和县| 当雄县| 辽阳市| 读书| 咸宁市| 仙居县| 醴陵市| 安塞县| 承德市| 通州市| 泗水县| 中卫市| 万荣县| 苍南县| 峨眉山市| 墨玉县| 乐都县| 卓尼县| 韩城市| 稷山县| 岑巩县| 湘阴县| 崇信县| 边坝县| 财经| 古田县|