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

MySQL查詢隨機(jī)數(shù)據(jù)的4種方法和性能對(duì)比

 更新時(shí)間:2014年04月08日 13:56:05   作者:  
從MySQL隨機(jī)選取數(shù)據(jù)也是我們最常用的一種發(fā)發(fā),其最簡(jiǎn)單的辦法就是使用”O(jiān)RDER BY RAND()”,本文介紹了包括ORDER BY RAND()的4種獲取隨機(jī)數(shù)據(jù)的方法,并分析了各自的優(yōu)缺點(diǎn)。
下面從以下四種方案分析各自的優(yōu)缺點(diǎn)。
方案一:
復(fù)制代碼 代碼如下:
SELECT * FROM `table` ORDER BY RAND() LIMIT 0,1;

這種方法的問題就是非常慢。原因是因?yàn)镸ySQL會(huì)創(chuàng)建一張零時(shí)表來保存所有的結(jié)果集,然后給每個(gè)結(jié)果一個(gè)隨機(jī)索引,然后再排序并返回。
有幾個(gè)方法可以讓它快起來。
基本思想就是先獲取一個(gè)隨機(jī)數(shù),然后使用這個(gè)隨機(jī)數(shù)來獲取指定的行。
由于所有的行都有一個(gè)唯一的id,我們將只取最小和最大id之間的隨機(jī)數(shù),然后獲取id為這個(gè)數(shù)行。為了讓這個(gè)方法當(dāng)id不連續(xù)時(shí)也能有效,我們?cè)谧罱K的查詢里使用”>=”代替”=”。
為了獲取整張表的最小和最大id,我們使用MAX()和MIN()兩個(gè)聚合函數(shù)。這兩個(gè)方法會(huì)返回指定組里的最大和最小值。在這里這個(gè)組就是我們表里的所有id字段值。
方案二:
復(fù)制代碼 代碼如下:
<?php
$range_result = mysql_query( " SELECT MAX(`id`) AS max_id , MIN(`id`) AS min_id FROM `table` ");
$range_row = mysql_fetch_object( $range_result );
$random = mt_rand( $range_row->min_id , $range_row->max_id );
$result = mysql_query( " SELECT * FROM `table` WHERE `id` >= $random LIMIT 0,1 ");

就像我們剛才提到的,這個(gè)方法會(huì)用唯一的id值限制表的每一行。那么,如果不是這樣情況怎么辦?
下面這個(gè)方案是使用了MySQL的LIMIT子句。LIMIT接收兩個(gè)參數(shù)值。第一個(gè)參數(shù)指定了返回結(jié)果第一行的偏移量,第二個(gè)參數(shù)指定了返回結(jié)果的最大行數(shù)。偏移量指定第一行是0而不是1。
為了計(jì)算第一行的偏移量,我們使用MySQL的RAND()方法從0到1之間生成一個(gè)隨機(jī)數(shù)。然后我們把這個(gè)數(shù)字跟我們用COUNT()方法獲取倒的表記錄數(shù)相乘。由于LIMIT的參數(shù)必須是int型而不能是float,我們使用FLOOR()來處理結(jié)果。FLOOR()會(huì)計(jì)算小于表達(dá)式的最大值。最終的代碼就是這樣:
方案三:
復(fù)制代碼 代碼如下:
<?php
$offset_result = mysql_query( " SELECT FLOOR(RAND() * COUNT(*)) AS `offset` FROM `table` ");
$offset_row = mysql_fetch_object( $offset_result );
$offset = $offset_row->offset;
$result = mysql_query( " SELECT * FROM `table` LIMIT $offset, 1 " );

在MySQL 4.1以后我們可以使用子子查詢合并上面兩個(gè)方法:
方案四:
復(fù)制代碼 代碼如下:
SELECT * FROM `table` WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) ORDER BY id LIMIT 1;

這個(gè)方案跟方案二有同樣的弱點(diǎn),只對(duì)有唯一id值的表有效。
記住我們最初尋找選擇隨機(jī)行的替代方法的原因,速度!所以,這些方案的在執(zhí)行時(shí)間上的比較會(huì)怎么樣?我不會(huì)指出硬件和軟件配置或者給出具體的數(shù)字。大概的結(jié)果是這樣的:
最慢的是解決方案一(我們假定它用了100%的時(shí)間)。
方案二用了79%
方案三 – 13%
方案四 – 16%
so, 方案三勝出!

相關(guān)文章

  • MySQL啟用SSD存儲(chǔ)的實(shí)例詳解

    MySQL啟用SSD存儲(chǔ)的實(shí)例詳解

    這篇文章主要介紹了MySQL啟用SSD存儲(chǔ)的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-10-10
  • mysql查看表結(jié)構(gòu)的三種方法總結(jié)

    mysql查看表結(jié)構(gòu)的三種方法總結(jié)

    這篇文章主要介紹了mysql查看表結(jié)構(gòu)的三種方法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • SQL如何使用正則表達(dá)式對(duì)數(shù)據(jù)進(jìn)行過濾

    SQL如何使用正則表達(dá)式對(duì)數(shù)據(jù)進(jìn)行過濾

    正則表達(dá)式的作用是匹配文本,將一個(gè)正則表達(dá)式與一個(gè)文本串進(jìn)行比較,下面這篇文章主要給大家介紹了關(guān)于SQL如何使用正則表達(dá)式對(duì)數(shù)據(jù)進(jìn)行過濾的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • MySQL學(xué)習(xí)之事務(wù)詳解

    MySQL學(xué)習(xí)之事務(wù)詳解

    在數(shù)據(jù)庫中?事務(wù)(transaction)?可以把多個(gè)SQL給打包到一起,?即將多個(gè)SQL語句變成一個(gè)整體,?也就是說一個(gè)事務(wù)中的所有操作要么全部成功執(zhí)行,?要么完全不執(zhí)行.本文主要來和大家聊聊事務(wù)的使用,需要的可以參考一下
    2022-12-12
  • 重置MySQL 8.0 Root密碼的簡(jiǎn)便方法小結(jié)

    重置MySQL 8.0 Root密碼的簡(jiǎn)便方法小結(jié)

    這篇文章主要給大家介紹了幾種輕松重置 MySQL 8.0 Root 密碼的簡(jiǎn)便方法,文中通過代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-10-10
  • MySQL觸發(fā)器運(yùn)用于遷移和同步數(shù)據(jù)的實(shí)例教程

    MySQL觸發(fā)器運(yùn)用于遷移和同步數(shù)據(jù)的實(shí)例教程

    這篇文章主要介紹了MySQL觸發(fā)器運(yùn)用于遷移和同步數(shù)據(jù)的實(shí)例教程,分別是SQL Server數(shù)據(jù)遷移至MySQL以及同步備份數(shù)據(jù)表記錄的兩個(gè)例子,需要的朋友可以參考下
    2015-12-12
  • 游戲和服備忘問題簡(jiǎn)析

    游戲和服備忘問題簡(jiǎn)析

    這篇文章主要介紹了游戲和服備忘問題簡(jiǎn)析,小編覺得挺不錯(cuò)的,這里分享給大家,希望給大家一個(gè)參考。
    2017-10-10
  • MySQL核心參數(shù)優(yōu)化文件my.ini實(shí)現(xiàn)

    MySQL核心參數(shù)優(yōu)化文件my.ini實(shí)現(xiàn)

    本文主要介紹了MySQL核心參數(shù)優(yōu)化文件my.ini實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • MySQL如何優(yōu)化查詢速度

    MySQL如何優(yōu)化查詢速度

    這篇文章主要介紹了MySQL如何優(yōu)化查詢速度,幫助大家提升自己的數(shù)據(jù)庫性能,感興趣的朋友可以了解下
    2020-08-08
  • MySQL約束和表的復(fù)雜查詢操作大全

    MySQL約束和表的復(fù)雜查詢操作大全

    約束是關(guān)系型數(shù)據(jù)庫的一個(gè)重要功能,?添加到庫中的數(shù)據(jù)需要保證其的正確性;?約束,?就是讓數(shù)據(jù)庫幫助程序員更好的檢查數(shù)據(jù)是否正確.,這篇文章主要介紹了MySQL約束和表的復(fù)雜查詢操作,需要的朋友可以參考下
    2022-11-11

最新評(píng)論

祁东县| 镇康县| 桐城市| 政和县| 金沙县| 龙陵县| 礼泉县| 江川县| 通海县| 武城县| 崇义县| 雷山县| 云浮市| 信阳市| 文登市| 安达市| 磴口县| 五大连池市| 腾冲县| 巫溪县| 蒙城县| 平遥县| 叙永县| 阳城县| 大新县| 兰溪市| 乌兰县| 临沭县| 阿克苏市| 海口市| 白沙| 望城县| 元氏县| 富顺县| 秦安县| 静安区| 巩义市| 香港 | 马尔康县| 施甸县| 宁河县|