2013
11
01

[轉貼]MySQL亂數取值的效率比較

關鍵字:MySQLOrder by Rand()RandRand效率

一般在製作抽獎時,大多是直接使用MySQL Rand()+INDEX的作法,但因為當資料筆數越多,就有可能會遇到搜尋效能越來越慢的問題!
以下利用二條語法來說明一下

方法1. 利用MySQL Rand()的方式取1筆資料,所需約0.3598 秒
SELECT * FROM log ORDER BY rand( ) limit 10
當資料越來越多時,時間上就會越來越慢,所以若資料量小時,可以使用此方法,但當有機會超過10萬筆時,因為Rand是針對整個Table全部掃描一次後,才x傳亂數資料,所以當您有10萬筆時,代表著MySQL需要先掃描過10萬次以上才能得到結果,根據官方的說明「Order by Rand()」也不建議使用在大量的資料上!

方法2. 利用JOIN、Max及Rand產生亂數筆數,所需約0.0008 秒
SELECT *
FROM log AS a
JOIN (
SELECT MAX( ID ) AS ID FROM log) AS b
ON ( a.ID >= FLOOR( b.ID * RAND( ) )
) LIMIT 10
當資料量大時,建議可以使用第二種方法,這樣可以大幅的縮減搜尋時間。
傑立資訊傑立資訊事業有限公司

電話:(02)2739-9096 | 傳真:(02)2739-6637 | 客服:service@julyinfo.com | 臺北市大安區和平東路3段257號6樓map

© 2016 傑立資訊 All rights reserved.法律顧問:宇恒法律事務所