欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MYSQL隨機抽取查詢 MySQL Order By Rand()效率問題

 更新時間:2011年11月07日 17:11:02   投稿:mdxy-dxy  
MYSQL隨機抽取查詢:MySQL Order By Rand()效率問題一直是開發(fā)人員的常見問題,俺們不是DBA,沒有那么牛B,所只能慢慢研究咯,最近由于項目問題,需要大概研究了一下MYSQL的隨機抽取實現(xiàn)方法

要從tablename表中隨機提取一條記錄,大家一般的寫法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。

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

但是真正測試一下才發(fā)現(xiàn)這樣效率非常低。一個15萬余條的庫,查詢5條數(shù)據,居然要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,網上基本上都是查詢max(id) * rand()來隨機獲取數(shù)據。
復制代碼 代碼如下:

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;

再把語句完善一下,加上MIN(id)的判斷。我在最開始測試的時候,就是因為沒有加上MIN(id)的判斷,結果有一半的時間總是查詢到表中的前面幾行。
完整查詢語句是:
復制代碼 代碼如下:

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;

復制代碼 代碼如下:

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 秒
看來采用JOIN的語法比直接在WHERE中使用函數(shù)效率還要高很多。

相關文章

  • 在WIN命令提示符下mysql 用戶新建、授權、刪除,密碼修改

    在WIN命令提示符下mysql 用戶新建、授權、刪除,密碼修改

    一般情況下,修改MySQL密碼,授權,是需要有mysql里的root權限的,本操作是在WIN命令提示符下,感興趣的朋友可以參考下
    2013-11-11
  • MySQL decimal unsigned更新負數(shù)轉化為0

    MySQL decimal unsigned更新負數(shù)轉化為0

    這篇文章主要介紹了MySQL decimal unsigned更新負數(shù)轉化為0,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-12-12
  • MySQL?表查詢必備:基本操作詳解

    MySQL?表查詢必備:基本操作詳解

    MySQL表基本查詢指南,帶你輕松掌握SQL查詢技巧!無論你是初學者還是老手,都能在本文中找到適合自己的學習內容,讓我們一起探索MySQL的世界吧!
    2024-01-01
  • MySQL拼接字符串函數(shù)GROUP_CONCAT詳解

    MySQL拼接字符串函數(shù)GROUP_CONCAT詳解

    本文給大家詳細講解了MySQL的拼接字符串函數(shù)GROUP_CONCAT的幾種使用方法以及詳細示例,有需要的小伙伴可以參考下
    2020-02-02
  • MySQL面試題講解之如何設置Hash索引

    MySQL面試題講解之如何設置Hash索引

    今天研究下mysql中索引,首先我應該知道的是,mysql中不同存儲引擎的索引工作方式不一樣,并且不是所有的存儲引擎都支持所有類型的索引。即使多個存儲引擎支持同一種類型的索引,那么他們的實現(xiàn)原理也是不同的,本文將講解Hash索引該如何設置
    2021-10-10
  • linux下mysql 5.7.16 免安裝版本圖文教程

    linux下mysql 5.7.16 免安裝版本圖文教程

    這篇文章主要為大家詳細介紹了linux下mysql 5.7.16 免安裝版本圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • MySQL分區(qū)表分區(qū)策略詳解

    MySQL分區(qū)表分區(qū)策略詳解

    這篇文章主要介紹了MySQL分區(qū)表分區(qū)策略詳解,分區(qū)是一種表的設計模式,通俗地講表分區(qū)是將一大表,根據條件分割成若干個小表。但是對于應用程序來講,分區(qū)的表和沒有分區(qū)的表是一樣的,需要的朋友可以參考下
    2023-07-07
  • 提高MySQL中InnoDB表BLOB列的存儲效率的教程

    提高MySQL中InnoDB表BLOB列的存儲效率的教程

    這篇文章主要介紹了提高MySQL中InnoDB表BLOB列的存儲效率的教程,InnoDB的優(yōu)化在MySQL的優(yōu)化研究中也是一個非常熱門的課題,需要的朋友可以參考下
    2015-05-05
  • 詳解Mysql函數(shù)調用優(yōu)化

    詳解Mysql函數(shù)調用優(yōu)化

    這篇文章主要介紹了Mysql 函數(shù)調用優(yōu)化的相關資料,幫助大家更好的理解和學習使用MySQL數(shù)據庫,感興趣的朋友可以了解下
    2021-04-04
  • 淺析mysql遷移到clickhouse的5種方法

    淺析mysql遷移到clickhouse的5種方法

    這篇文章主要介紹了mysql遷移到clickhouse的5種方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-07-07

最新評論