count,size,length到底有什麼區別

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方法一樣,直接讀取集合的個數了。 

基於以上的分析,結論:雖然以上三種方法都可以取得數據記錄的個數,但是還是要根據根據實際所需要,調用相應的方法,以達到優化。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章