程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL查詢隨機數據的4種辦法和機能比較

MySQL查詢隨機數據的4種辦法和機能比較

編輯:MySQL綜合教程

MySQL查詢隨機數據的4種辦法和機能比較。本站提示廣大學習愛好者:(MySQL查詢隨機數據的4種辦法和機能比較)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL查詢隨機數據的4種辦法和機能比較正文


上面從以下四種計劃剖析各自的優缺陷。
計劃一:
SELECT * FROM `table` ORDER BY RAND() LIMIT 0,1;
這類辦法的成績就長短常慢。緣由是由於MySQL會創立一張零時表來保留一切的成果集,然後給每一個成果一個隨機索引,然後再排序並前往。
有幾個辦法可讓它快起來。
根本思惟就是先獲得一個隨機數,然後應用這個隨機數來獲得指定的行。
因為一切的行都有一個獨一的id,我們將只取最小和最年夜id之間的隨機數,然後獲得id為這個數行。為了讓這個辦法當id不持續時也能有用,我們在終究的查詢裡應用”>=”取代”=”。
為了獲得整張表的最小和最年夜id,我們應用MAX()和MIN()兩個聚合函數。這兩個辦法會前往指定組裡的最年夜和最小值。在這裡這個組就是我們內外的一切id字段值。
計劃二:
<?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 ");
就像我們適才提到的,這個辦法會用獨一的id值限制表的每行。那末,假如不是如許情形怎樣辦?
上面這個計劃是應用了MySQL的LIMIT子句。LIMIT吸收兩個參數值。第一個參數指定了前往成果第一行的偏移量,第二個參數指定了前往成果的最年夜行數。偏移量指定第一行是0而不是1。
為了盤算第一行的偏移量,我們應用MySQL的RAND()辦法從0到1之間生成一個隨機數。然後我們把這個數字跟我們用COUNT()辦法獲得倒的表記載數相乘。因為LIMIT的參數必需是int型而不克不及是float,我們應用FLOOR()來處置成果。FLOOR()管帳算小於表達式的最年夜值。終究的代碼就是如許:
計劃三:
<?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今後我們可使用子子查詢歸並下面兩個辦法:
計劃四:
SELECT * FROM `table` WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) ORDER BY id LIMIT 1;
這個計劃跟計劃二有異樣的弱點,只對有獨一id值的表有用。
記住我們最後尋覓選擇隨機行的替換辦法的緣由,速度!所以,這些計劃的在履行時光上的比擬會怎樣樣?我不會指出硬件和軟件設置裝備擺設或許給出詳細的數字。年夜概的成果是如許的:
最慢的是處理計劃一(我們假定它用了100%的時光)。
計劃二用了79%
計劃三 – 13%
計劃四 – 16%
so, 計劃三勝出!
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved