共計 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 小編將為大家輸出更多高質量的實用文章!