count,size,length到底有什麼區別呢?通過以下的測試結果可以發現問題:
Post.find_by_id(953125641).comments.length產生了如下的SQL語句
[4;35;1mPost Columns (0.000000)[0m [0mSHOW FIELDS FROM `posts`[0m
[4;36;1mPost Load (0.016000)[0m [0;1mSELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1[0m
[4;35;1mComment Load (0.016000)[0m [0mSELECT * FROM `comments` WHERE (`comments`.post_id = 953125641) [0m
Post.find_by_id(953125641).comments.size產生了如下的SQL語句
[4;36;1mPost Columns (0.000000)[0m [0;1mSHOW FIELDS FROM `posts`[0m
[4;35;1mPost Load (0.016000)[0m [0mSELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1[0m
[4;36;1mComment Columns (0.000000)[0m [0;1mSHOW FIELDS FROM `comments`[0m
[4;35;1mSQL (0.015000)[0m [0mSELECT count(*) AS count_all FROM `comments` WHERE (`comments`.post_id = 953125641) [0m
Post.find_by_id(953125641).comments.count產生了如下的SQL語句
[4;36;1mPost Columns (0.000000)[0m [0;1mSHOW FIELDS FROM `posts`[0m
[4;35;1mPost Load (0.015000)[0m [0mSELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1[0m
[4;36;1mComment Columns (0.000000)[0m [0;1mSHOW FIELDS FROM `comments`[0m
[4;35;1mSQL (0.016000)[0m [0mSELECT count(*) AS count_all FROM `comments` WHERE (`comments`.post_id = 953125641) [0m
@post = Post.find_by_id(953125641)
@length = @post.comments.length產生了如下的SQL語句
[4;35;1mPost Columns (0.000000)[0m [0mSHOW FIELDS FROM `posts`[0m
[4;36;1mPost Load (0.000000)[0m [0;1mSELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1[0m
[4;35;1mComment Load (0.000000)[0m [0mSELECT * FROM `comments` WHERE (`comments`.post_id = 953125641) [0m
@post = Post.find_by_id(953125641)
@length = @post.comments.size產生了如下的SQL語句
[4;36;1mPost Columns (0.015000)[0m [0;1mSHOW FIELDS FROM `posts`[0m
[4;35;1mPost Load (0.016000)[0m [0mSELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1[0m
[4;36;1mComment Columns (0.000000)[0m [0;1mSHOW FIELDS FROM `comments`[0m
[4;35;1mSQL (0.000000)[0m [0mSELECT count(*) AS count_all FROM `comments` WHERE (`comments`.post_id = 953125641) [0m
@post = Post.find_by_id(953125641)
@length = @post.comments.count產生了如下的SQL語句
[4;36;1mPost Columns (0.015000)[0m [0;1mSHOW FIELDS FROM `posts`[0m
[4;35;1mPost Load (0.000000)[0m [0mSELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1[0m
[4;36;1mComment Columns (0.000000)[0m [0;1mSHOW FIELDS FROM `comments`[0m
[4;35;1mSQL (0.000000)[0m [0mSELECT count(*) AS count_all FROM `comments` WHERE (`comments`.post_id = 953125641) [0m
@post = Post.find_by_id(953125641)
@comments = @post.comments
@length = @comments.count產生了如下的SQL語句
[4;36;1mPost Columns (0.000000)[0m [0;1mSHOW FIELDS FROM `posts`[0m
[4;35;1mPost Load (0.016000)[0m [0mSELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1[0m
[4;36;1mComment Columns (0.000000)[0m [0;1mSHOW FIELDS FROM `comments`[0m
[4;35;1mSQL (0.000000)[0m [0mSELECT count(*) AS count_all FROM `comments` WHERE (`comments`.post_id = 953125641) [0m
@post = Post.find_by_id(953125641)
@comments = @post.comments
@length = @comments.length產生了如下的SQL語句
[4;36;1mPost Columns (0.015000)[0m [0;1mSHOW FIELDS FROM `posts`[0m
[4;35;1mPost Load (0.000000)[0m [0mSELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1[0m
[4;36;1mComment Load (0.000000)[0m [0;1mSELECT * FROM `comments` WHERE (`comments`.post_id = 953125641) [0m
@post = Post.find_by_id(953125641)
@comments = @post.comments
@length = @comments.size產生了如下的SQL語句
[4;35;1mPost Columns (0.016000)[0m [0mSHOW FIELDS FROM `posts`[0m
[4;36;1mPost Load (0.000000)[0m [0;1mSELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1[0m
[4;35;1mComment Columns (0.015000)[0m [0mSHOW FIELDS FROM `comments`[0m
[4;36;1mSQL (0.000000)[0m [0;1mSELECT count(*) AS count_all FROM `comments` WHERE (`comments`.post_id = 953125641) [0m
@post = Post.find_by_id(953125641)
@comments = @post.comments.find(:all)
@length = @comments.size產生了如下的SQL語句
[4;35;1mPost Columns (0.015000)[0m [0mSHOW FIELDS FROM `posts`[0m
[4;36;1mPost Load (0.032000)[0m [0;1mSELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1[0m
[4;35;1mComment Load (0.000000)[0m [0mSELECT * FROM `comments` WHERE (`comments`.post_id = 953125641) [0m
由以上的測試數據表明: #count方法總是會產生count(*)的SQL語句去查詢數據庫,而#length方法總是取查詢出的集合的個數,它總是不會產生count(*)的查詢,#size方法就比較好了,如果目標集合還沒有取出來,它會像#count方法一樣,產生count(*)的查詢,如果記錄已經取出來了,它就像#length方法一樣,直接讀取集合的個數了。
基於以上的分析,結論:雖然以上三種方法都可以取得數據記錄的個數,但是還是要根據根據實際所需要,調用相應的方法,以達到優化。
count,size,length到底有什麼區別
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.