亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

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

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

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;

但是這樣會(huì)產(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;

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

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;

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

相關(guān)文章

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

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

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

    MySQL decimal unsigned更新負(fù)數(shù)轉(zhuǎn)化為0

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

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

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

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

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

    MySQL面試題講解之如何設(shè)置Hash索引

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

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

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

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

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

    提高M(jìn)ySQL中InnoDB表BLOB列的存儲(chǔ)效率的教程

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

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

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

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

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

最新評論