萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> sql order by rand隨機數據優化與性能對比

sql order by rand隨機數據優化與性能對比

今天要做網站文章右則隨機推薦功能,這個我們需要根據當前分類中隨機調用不同文章出來,下面我來給大家分享我在使用order by rand取隨機數據優化。

測試環境

apache2.2/php5.2/mysql5

測試數據

15W+數據,數據表大小600MB

測試語句

最初使用的是 order by rand()了,發現幾萬條數據居然要10秒之長的時間很是悲劇吧

 代碼如下 復制代碼

SELECT * FROM `表名`  order by rand()

顯示行 0 - 29 (154,825 總計, 查詢花費 10.1125 秒)


後來網上搜索到如下方法,同樣數據感覺有很大的提高了(這裡測試的是15W數據)

 代碼如下 復制代碼

SELECT * FROM 表名 WHERE id >= ((SELECT MAX(id) FROM 表名)-(SELECT MIN(id) FROM 表名)) *

RAND() + (SELECT MIN(id) FROM 表名) LIMIT 10

顯示行 0 - 29 (154,825 總計, 查詢花費 0.0221 秒)

感覺不錯了,有朋友說用join可能更好,於時找了一段代碼測試一下查詢花費 0.0025 秒,又提供了幾倍呀。

 代碼如下 復制代碼

SELECT *
FROM 表名 AS t1
JOIN (
SELECT ROUND( RAND( ) * (
SELECT MAX( id )
FROM 表名 ) ) AS id
) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id ASC
LIMIT 10

顯示行 0 - 9 (10 總計, 查詢花費 0.0025 秒)

最後還可以優化一下

 代碼如下 復制代碼

SELECT s_url,title
FROM 表名 AS t1
JOIN (
SELECT ROUND( RAND( ) * (
SELECT MAX( id )
FROM 表名 ) ) AS id
) AS t2
WHERE t1.id >= t2.id and t1.z_type = $z_type ORDER BY t1.id asc LIMIT 10

顯示行 0 - 9 (10 總計, 查詢花費 0.0008 秒)

總結一下,我們如果用同樣的方法在字段選擇時越少越好,這不從0.0025直接降到0.0008秒了哦。

copyright © 萬盛學電腦網 all rights reserved