mysql教程不用rand()函數實現隨機讀取數據庫教程記錄的方法
,以及google了一下相關的文件,發現大家幾乎清一色使用 order by rand() 來達到該目的,但是實際上存在非常嚴重的性能問題。
如果你的數據庫裡只有幾百條,且調用次數又不多的情況下,你愛用啥方法就用啥方法。
但如果你有10萬或100萬或更多條數據的話,那麼每次執行帶 order by rand() 的 sql 語句的時候,mysql服務器需要計算出10萬或100萬或更多個隨機數,可想而知對數據庫服務器的資源浪費有多大。
我建議大家使用以下方法之一:
第一種:count + limit
1、select count(*) from table_name // 獲取到數據庫總記錄 $count
2、$randoffset = rand(0, $count-1);
3、select * from table_name limit $randoffset,1
第二種:maxid
1、select max(id) from table_name // 獲取數據庫主鍵字段的最大值 $maxid
2、$randid = rand(0, $maxid);
3、select * from table_name where id>=$randid limit 1
如果能確保id是連續的,甚至可以直接算出一組 $randid,然後用 where id in ($randid_1, $randid_2, ...),批量提取數據
如果id不是連續的,可以使用多算一些隨機數,然後 where id in ($randid_1, $randid_2, ... $randid_100) limit 10,雖然我為了提取10條記錄計算了100個隨機數,但總比用 order by rand() 需要算幾萬幾十萬幾百萬個隨機數劃算的多吧。