最近工作中遇到一個需求是定時查詢用戶表,並隨機獲取其中的一條信息,因爲剛從oracle轉MySQL,對mysql沒那麼熟悉,所以上完檢索了一下,大概有幾種方案:
方法一、最原始,最直觀的語法
SELECT * FROM tableName ORDER BY RAND() LIMIT 1
不過這種方式極不推薦,因爲試過,查詢效率極低
方法二、(花費時間 0.147433 秒 )
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;
方法三、(花費時間 0.015130 秒 )
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 1;
總結:方式二和方式三都是效率很高的,不過通過對比,明顯方式三更勝一籌,看來採用JOIN的語法比直接在WHERE中使用函數效率還要高很多