最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mysql優(yōu)化取隨機(jī)數(shù)據(jù)慢的方法

 更新時(shí)間:2013年11月05日 14:42:15   作者:  
mysql取隨機(jī)數(shù)據(jù)慢,怎么辦?下面小編與大家一起來看看mysql取隨機(jī)數(shù)據(jù)慢優(yōu)化的過程。
前天因?yàn)楣ぷ餍枰野褟囊粋€(gè)5W記錄的數(shù)據(jù)庫中隨機(jī)抽取幾條記錄了,這里我是直接使用mysql rand by函數(shù)來直接,幾千條記錄沒關(guān)系,但如果到了幾萬條感覺要幾秒,這個(gè)就很慢了,下面小編與大家一起來看看mysql 取隨機(jī)數(shù)據(jù)慢優(yōu)化過程。
MySQL很多時(shí)候需要獲取隨機(jī)數(shù)據(jù),舉個(gè)例子,要從tablename表中隨機(jī)提取一條記錄,大家一般的寫法就是:
復(fù)制代碼 代碼如下:

SELECT * FROM tablename ORDER BY RAND() LIMIT 1
 

但是,后來我查了一下MYSQL的官方手冊(cè),里面針對(duì)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秒以上。查看官方手冊(cè),也說rand()放在ORDER BY 子句中會(huì)被執(zhí)行多次,自然效率及很低。
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;
 

我測試了一下,需要0.5秒,速度也不錯(cuò),但是跟上面的語句還是有很大差距??傆X有什么地方不正常。
于是把語句改寫了一下。
復(fù)制代碼 代碼如下:

SELECT * FROM 'table'
WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM 'table'))) 
ORDER BY id LIMIT 1;
 

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

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(
# 最小值 + (1 至 最小與最大值差)
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中對(duì)這兩個(gè)語句進(jìn)行分別查詢10次,前者花費(fèi)時(shí)間 0.147433 秒,后者花費(fèi)時(shí)間 0.015130 秒??磥聿捎肑OIN的語法比直接在WHERE中使用函數(shù)效率還要高很多。
復(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 10;
 

這個(gè)就是我自己選用了,從以前5秒到現(xiàn)面0.0003秒時(shí)間都不用就查出10條記錄了。

相關(guān)文章

  • CentOS7.x卸載與安裝MySQL5.7的操作過程及編碼格式的修改方法

    CentOS7.x卸載與安裝MySQL5.7的操作過程及編碼格式的修改方法

    這篇文章主要介紹了CentOS7.x卸載與安裝MySQL5.7的操作過程及編碼格式的修改方法,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-05-05
  • mysql索引覆蓋實(shí)例分析

    mysql索引覆蓋實(shí)例分析

    這篇文章主要介紹了mysql索引覆蓋,簡單說明了索引覆蓋的概念,并結(jié)合實(shí)例形式分析了mysql索引覆蓋的相關(guān)應(yīng)用與操作注意事項(xiàng),需要的朋友可以參考下
    2019-07-07
  • MYSQL中Truncate的用法詳解

    MYSQL中Truncate的用法詳解

    這篇文章主要介紹了MYSQL中Truncate的用法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • MySQL中的REPLACE?INTO語法詳解

    MySQL中的REPLACE?INTO語法詳解

    REPLACEINTO是MySQL中的一種特殊語句,用于在插入數(shù)據(jù)時(shí)檢測是否存在沖突,如果目標(biāo)表中已存在與新插入行的主鍵(PRIMARYKEY)或唯一鍵(UNIQUEKEY)沖突的記錄,則會(huì)刪除舊記錄并插入新記錄
    2025-02-02
  • linux/mac安裝mysql忘記密碼的解決辦法

    linux/mac安裝mysql忘記密碼的解決辦法

    這篇文章主要給大家介紹了關(guān)于linux/mac安裝mysql忘記密碼的解決辦法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • Linux安裝Mysql8.0.20并配置主從復(fù)制(一主一從,雙主雙從)

    Linux安裝Mysql8.0.20并配置主從復(fù)制(一主一從,雙主雙從)

    本文主要介紹了Linux安裝Mysql8.0.20并配置主從復(fù)制,包含一主一從和雙主雙從,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • 詳解MySQL中的基本表與視圖

    詳解MySQL中的基本表與視圖

    Mysql是一種常用的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),其中的基本表和視圖是數(shù)據(jù)庫中存儲(chǔ)和操作數(shù)據(jù)的兩種重要方式,本文將介紹什么是基本表和視圖,并探討為何要使用視圖以及視圖的優(yōu)缺點(diǎn),最后,將給出在Mysql中創(chuàng)建視圖的方法,需要的朋友可以參考下
    2023-09-09
  • clickhouse中Nullable與非空字段的建表與類型互轉(zhuǎn)方式

    clickhouse中Nullable與非空字段的建表與類型互轉(zhuǎn)方式

    這篇文章主要介紹了clickhouse中Nullable與非空字段的建表與類型互轉(zhuǎn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • mac系統(tǒng)OS X10.10版本安裝最新5.7.9mysql的方法

    mac系統(tǒng)OS X10.10版本安裝最新5.7.9mysql的方法

    這篇文章給大家介紹mac系統(tǒng)OS X10.10版本安裝最新5.7.9mysql的方法,本文分步驟純文字說明,介紹的非常詳細(xì),具有參考價(jià)值,在此分享供大家參考
    2015-10-10
  • mysql 5.7.17 免安裝版配置方法圖文教程(windows10)

    mysql 5.7.17 免安裝版配置方法圖文教程(windows10)

    這篇文章主要為大家詳細(xì)介紹了windows10下mysql 5.7.17 免安裝版配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01

最新評(píng)論

广昌县| 澎湖县| 桃江县| 铜山县| 巩留县| 长阳| 卢氏县| 岳池县| 蒙阴县| 彩票| 绥化市| 宁陕县| 寻乌县| 崇信县| 云霄县| 木兰县| 固阳县| 若羌县| 马山县| 贺州市| 南和县| 长兴县| 崇左市| 定日县| 昭觉县| 台北市| 沙田区| 宁河县| 应用必备| 普格县| 娄烦县| 巴楚县| 枝江市| 辽阳县| 池州市| 松潘县| 卫辉市| 磴口县| 垦利县| 英德市| 柳林县|