1. 程式人生 > >mysql 隨機獲取幾條記錄 學習筆記

mysql 隨機獲取幾條記錄 學習筆記

order 磁盤 從表 臨時 種類型 數據行 files 階段 標識

如何從表裏隨機的取三個值? 1、selelct word from words order by rand() limit 3 但是 使用explain命令看執行情況會發現有using temporary using filesort 說明使用了臨時表和排序 之前了解到排序mysql的內部算法分全字段排序和rowid排序,基於之前學習的結論,對於InnoDB表來說,執行全字段排序會減少磁盤訪問,因此會被優先選擇。強調INnodb表,對於內存表,回表過程只是簡單的根據數據行的位置,直接訪問內存得到數據,根本不會導致多訪問磁盤,優化器沒有了這一層的考慮,那麽它會優先考慮的,就是用戶排序的行越少越好了,所以mysql會選擇rowid排序 mysql表使用什麽方法來定位一行數據的?如果把一個innodb表的主鍵刪掉,是不是就沒有主鍵了,就沒辦法回表了? 其實不是,如果沒有創建表沒有主鍵,或者把一個表的主鍵刪除了,那麽Innodb會自己生成一個長度為6字節的rowid來作為主鍵,用來唯一標識數據行的信息 對於有主鍵的Innodb表來說,這個rowid就是主鍵ID 對於沒有主鍵的Innodb表來說,這個rowid就是由系統生成的 memory引擎不是索引組織表, 總結:order by rand()使用了內存臨時表,內存臨時表排序的時候使用了rowid的排序方法 其實所有的臨時表都不全是內存表,主要取決於tmp_table_size這個配置限制,默認是16M,如果臨時表大小超過了tmp_table_size那麽內存臨時表就會轉成磁盤臨時表 不管使用哪種類型的臨時表,order by rand 這種寫法都會讓計算過程非常復雜,需要大量的掃描行數,因此排序過程的資源消耗也非常大 如果按照我的解決方式 就是 按照業務需求,隨機取三個,數據庫還在設計階段,可以增加一個主鍵字段,用來記錄每行記錄的rowid,這樣一萬行,那就是連續的一萬,然後隨機,用該隨機rowid回表查詢該行記錄

來自 極客時間 msql實戰 林曉斌寫的 非常好 推薦

mysql 隨機獲取幾條記錄 學習筆記