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

首頁 > 數據庫 > MySQL > 正文

MySQL隨機查詢記錄的效率測試分析

2024-07-24 12:44:23
字體:
來源:轉載
供稿:網友
以下就是文章的主要內容。
  1.SELECT * FROM `table` ORDER BY RAND() LIMIT 5
  就可以了。
  但是真正測試一下才發現這樣效率非常低。一個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()來隨機獲取數據。
  1.SELECT *
  2.FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2
  3.WHERE t1.id >= t2.id
  4.ORDER BY t1.id ASC LIMIT 5;
  但是這樣會產生連續的5條記錄。解決辦法只能是每次查詢一條,查詢5次。即便如此也值得,因為15萬條的表,查詢只需要0.01秒不到。
  上面的語句采用的是JOIN,MySQL的論壇上有人MySQL使用
  1.SELECT *
  2.FROM `table`
  3.WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` )
  4.ORDER BY id LIMIT 1;
  我測試了一下,需要0.5秒,速度也不錯,但是跟上面的語句還是有很大差距。總覺有什么地方不正常。
  于是我把語句改寫了一下。
  1.SELECT * FROM `table`
  2.WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)))
  3.ORDER BY id LIMIT 1;
  這下,效率又提高了,查詢時間只有0.01秒
  最后,再把語句完善一下,加上MIN(id)的判斷。我在最開始測試的時候,就是因為沒有加上MIN(id)的判斷,結果有一半的時間總是查詢到表中的前面幾行。
  完整查詢語句是:
  1.SELECT * FROM `table`
  2.WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`)))
  3.ORDER BY id LIMIT 1;
  4.SELECT *
  5.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
  6.WHERE t1.id >= t2.id
  7.ORDER BY t1.id LIMIT 1;
  最后在php中對這兩個語句進行分別查詢10次,
  前者花費時間 0.147433 秒
  后者花費時間 0.015130 秒
  看來采用JOIN的語法比直接在WHERE中使用函數效率還要高很多。以上的相關內容就是對MySQL使用rand隨機查詢記錄效率測試的介紹,望你能有所收獲。

您可能感興趣的文章:

解析mysql中:單表distinct、多表group by查詢去除重復記錄MySQL分表實現上百萬上千萬記錄分布存儲的批量查詢設計模式詳解mysql 開啟慢查詢 如何打開mysql的慢查詢日志記錄mysql中RAND()隨便查詢記錄效率問題和解決辦法分享mysql 查詢第幾行到第幾行記錄的語句MySQL 查詢某個字段不重復的所有記錄使用mysql的disctinct group by查詢不重復記錄使用distinct在mysql中查詢多條不重復記錄值的解決辦法Mysql查詢最近一條記錄的sql語句(優化篇)
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 樟树市| 四川省| 和田市| 绵阳市| 绥德县| 察雅县| 济阳县| 安仁县| 班戈县| 荣昌县| 哈巴河县| 安庆市| 本溪| 赣州市| 云南省| 博湖县| 秦安县| 阳山县| 南雄市| 阜南县| 大名县| 台北县| 吉首市| 科技| 莱阳市| 城市| 宿迁市| 班戈县| 岗巴县| 永州市| 张家港市| 漳平市| 徐州市| 江永县| 承德县| 梁河县| 盐山县| 乌兰察布市| 汕尾市| 马关县| 精河县|