2008-06-25
在Rails中关于size,length,count三个方法的区别
关键字: activerocord
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方法一样,直接读取集合的个数了。
基于以上的分析,结论:虽然以上三种方法都可以取得数据记录的个数,但是还是要根据根据实际所需要,调用相应的方法,以达到优化。
参考资料:
我发的帖子: http://www.railsforum.com/viewtopic.php?id=19593
文章:count vs length vs size http://blog.hasmanythrough.com/2008/2/27/count-length-size
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方法一样,直接读取集合的个数了。
基于以上的分析,结论:虽然以上三种方法都可以取得数据记录的个数,但是还是要根据根据实际所需要,调用相应的方法,以达到优化。
参考资料:
我发的帖子: http://www.railsforum.com/viewtopic.php?id=19593
文章:count vs length vs size http://blog.hasmanythrough.com/2008/2/27/count-length-size
- 20:20
- 浏览 (63)
- 评论 (1)
- 分类: Ruby and Rails
- 进入论坛
- 相关推荐
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 9305 次
- 性别:

- 来自: 与JE一起成长

- 详细资料
搜索本博客
我的相册
qq.png
共 4 张
共 4 张
最近加入圈子
链接
- 蕲春人
- 数据库模型分享
- JAVA项目网
- 关于ror的博客
- http://groovie.org/
- Ruby语言思想驱动
- dzone
- 喜道技术笔记
- 铁道播客
- Agile Web Development
- ror开源一看
- 中国onrails社区
- Rails2中文站
- rails and ruby
- Err the Blog
- http://zilkey.com/
- Rails2 API
- Typo Blog
- Rails2.1 API
- 海阳的新博客
- Ruby中文门门
- Rails视频
- Rails Engin
- Railslodge
- http://davidsmalley.com/
- http://www.railsenvy.com/
- http://www.railway.at/
- LetRails
- 外国模块网
- Devint ART
- Smashing Magazine
- Csscreme
- topcsstemplates
- CSS库
- Urban Puddle
- SEO on Rails
- RailsExpress.blog
- BenCurtis.com
- 免费CSS模板
- dianeyu
- 剌洪利的博客
- CSS Zen Garden CSS Demo
- Ajax Daddy
- English Chat
最新评论
-
互联网创业是程序员腾达的 ...
hunter.wxhu 写道 又一个偏执狂,想象很美好,时机很现实, 成功的机会 ...
-- by qichunren -
互联网创业是程序员腾达的 ...
又一个偏执狂,想象很美好,时机很现实, 成功的机会很少啊 。技术只是成功的一个要 ...
-- by hunter.wxhu -
互联网创业是程序员腾达的 ...
想要互联网创业,作为程序员一个人想创业,我是不赞成的,这是因为我们思维的问题,除 ...
-- by jhj823900 -
互联网创业是程序员腾达的 ...
bayers 写道 创业教程初级班秘籍之一: 因为发现了确定的可以赚到钱的可行 ...
-- by gigix -
互联网创业是程序员腾达的 ...
『创业家园』 [经验交流]创业实战初级班教程 zt http://cache.t ...
-- by bayers






评论排行榜