Stan Blog

學習過程中的一些記錄

[Ruby] count, length, size 差異

count

使用 SQL query (SELECT COUNT(*) FROM…) 不會儲存計算物件,每次執行 count 都會重新跑一次 SQL query 速度比 length 快

length

回傳一個集合的長度 計算物件會儲存在記憶體中 如果是 eager loaded 的物件,執行速度會非常快

size

綜合上述兩者的特性 如果是已經在記憶體中的集合,就直接計算長度 (不會有額外的 query) 如果是 lazy loaded 的集合,就會直行 SQL query

補充

在 Association 的情況下,查找關聯的數量時如果表上有 xxx_count 這種欄位,則用 #size 會直接撈取這個欄位出來,而 #count 則是會再跑 COUNT(*) 這種 SQL 去算

Rails 的 Model 裡面有一個內建的 counter cache 功能幫助你記錄 只要設定好 counter_cache: :xxx_count (xxx 是你剛剛建立的欄位名稱) 只要 xxx 有 createdestroy 的動作,就會自動在 xxx_count 欄位 +1 跟 -1

避免使用 #count 在程式的迴圈裡面跑太多 SQL 搜尋,以減少網站 server 的負擔


Ref:

Comments

comments powered by Disqus