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