MYSQL的隨機抽取實現方法

2B青年的寫法:

SELECT * FROM tablename ORDER BY RAND() LIMIT 1

 據MYSQL手冊上介紹:ORDER BY 語句中,不能使用一個帶有RAND() 值的列,原因是 ORDER BY 會計算列的多重時間,但是 仍然可以通過ORDER BY RAND()來實現隨機,數據庫量大的時候,執行效率超低。

 

文藝青年的寫法:

1、

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;

 2、

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;

 最後在php中對這兩個語句進行分別查詢10次,
後者花費時間 0.147433 秒
前者花費時間 0.015130 秒
看來採用JOIN的語法比直接在WHERE中使用函數效率還要高很多。

 

參考:http://www.cnblogs.com/phper7/archive/2010/05/26/1744063.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章