從MySQL數(shù)據(jù)表中查詢一條隨機的記錄。
- 前提知識點
SELECT RAND(); #返回0~1之間的16位小數(shù) SELECT MAX(ID) FROM table; #返回table中ID列最大的值 SELECT MIN(ID) FROM table; #返回table中ID列最小的值 SELECT CEIL(4.1); #向上取整 SELECT FLOOR(4.1); #向下取整
- 方式一
將數(shù)據(jù)隨機按表中其中一列排序,取排序后的第一條SELECT * FROM foo ORDER BY RAND() LIMIT 1當數(shù)據(jù)表中數(shù)據(jù)量較小時,此方法可行。但當數(shù)據(jù)量到達一定程度,比如100萬數(shù)據(jù)或以上,就有很大的性能問題。
如果你通過EXPLAIN來分析這個 語句,會發(fā)現(xiàn)雖然MySQL通過建立一張臨時表來排序,但由于ORDER BY和LIMIT本身的特性,在排序未完成之前,我們還是無法通過LIMIT來獲取需要的記錄。
亦即,你的記錄有多少條,就必須首先對這些數(shù)據(jù)進行排序.
- 方式二
- 使用主鍵索引,避免全表掃描
- 使用隨機區(qū)間過濾,返回區(qū)間內(nèi)的第一條數(shù)據(jù)
SELECT * FROM `table` WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`))) ORDER BY id LIMIT 1;