.length VS .count VS .size 效能


#1

想請問如果有個需求是需要算出所有會員的總數
User.count VS User.all.size VS User.all.length哪個效能會比較好呢?


#2

一定是 User.count,這會在 DB 層下 query 直接查詢數量
後二者都是從 DB 拉出所有資料後再由 Ruby 計算數量


#3

感謝大大的回答,那想請問如果我需要做多個條件的搜尋,該如何優化呢
User.where("created_at >= ?", Time.zone.now.beginning_of_day).where(role: 'member').count
這樣兩個where就變成select兩次,但不知道如果使用"created_at >= ?"的方式搜尋,該如何下多個條件在同一個where裡面


#4

這樣並不會查詢兩次,連續下兩次 .where(A).where(B) 的意思是我要查 A 且 B 的資料,他會將條件合併後再搜尋

你可以用 User.where("created_at >= ?", Time.zone.now.beginning_of_day).where(role: 'member').to_sql 看看最後用來查詢的 SQL 語句長怎樣


#5

了解,感謝大大的回覆,又增長了知識,謝謝
那如果設計一個頁面是會讀出全部總數的數據,有多個的話
會建議剛進頁面,拉一次資料,然後Cache住
還是會建議說我設定一個排程,每個晚上固定計算,然後寫到一張表裡面呢?


#6

你想要 cache 的話應該也不要寫到 DB 裡面了,Redis/SSDB 是你的好夥伴 (見 Redis / SSDB 簡介與使用說明
不過除非你的數據過大或是沒有即時運算的需求的話,正常來說還是會即時的去求這個數字

如果你想要的是把所有資料印出來,建議你作分頁