- 浏览: 335994 次
- 性别:
- 来自: 蕲春->上海
文章分类
最新评论
-
duanyu010:
"Devel"选项 选项下包含了多个 gc ...
在cygwin中安装gcc编译器 -
brown802:
Event.observe('test', 'click',f ...
Prototype中的Event.observe用法 -
zhangyanan_it:
讲一下好吧!
Rails MD5 SHA1 加密用戶密碼 -
zhangyanan_it:
多谢!
Rails MD5 SHA1 加密用戶密碼 -
virusswb:
paperclip文件上传
在Rails中快速方便地使用Tiny mce编辑器
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
发表评论
-
使用Ruby Encoder加密Ruby代码
2012-02-27 13:56 2377Use Rubyencoder Encrypt Ruby ... -
解决oracle-enhancedk中的一个bug
2010-12-06 09:57 0usermatoMacBook-Pro:jjsc_web_ba ... -
mac osx上安装rmagick
2010-10-25 12:03 4221本来以为安装这个超级麻烦,我那时是想从源码编译安装,后来找到p ... -
dduuuuuuu
2010-10-20 21:02 0说说rspec2 rspec2 前不久出来了,它 ... -
最新版本的gcc编译安装fcgi出错的解决办法
2010-03-06 17:43 10179最近在折腾vps,在上面步骤ROR应用,部署方案还是用我倾向的 ... -
来自O’Reilly出版社的《Ruby Best Practices》
2010-03-04 17:40 1742我在rubyinside网站上看到了《Ruby Best Pr ... -
手机版网站开发(1)
2010-01-25 18:16 0要开始着手这方面的事情了,所以通些这段时间的调研,发现要关注的 ... -
在Ruby中调用存储过程
2010-01-23 10:57 0在pl/sql developer里 Connected t ... -
Rails2.0.2中rake在production环境不能log
2010-01-22 15:14 1276目前的定时任务是用cron + rake。 在rake中使用 ... -
Will_paginate支持分页和排序的多条件查询
2009-12-28 11:09 0Logistic Model # 支持分页和排序的多条件查 ... -
Rails生成HTML
2009-12-28 10:59 1752在Rails中生成HTML一般有现在的Page Cache,不 ... -
Ruby中处理Excel
2009-12-19 14:23 1196发现了一个很不错的解决方案: 这里是它的GUIDE http: ... -
在Rails中的 Model中使用current_user
2009-12-19 12:31 4652在Rails中的 Model(业务层)中使用current_u ... -
在Ruby中处理压缩文件
2009-12-18 18:39 1036http://rubyzip.sourceforge.net/ ... -
火星高楼抢楼机器人
2009-08-05 14:15 13092009-8-14下午JavaEye登录更新了,加了图片验证码 ... -
Rails中使用好named_scope与时间区间
2009-07-18 00:56 2452在我最近的工作中,由于要做数据统计,与时间区间打交道非常多,如 ... -
Ruby中的类方法与实例方法
2009-06-28 18:12 3070原文:http://railstips.org/2 ... -
Rails社区对Rails3特性的讨论和反馈
2009-05-31 21:29 2294Rails官方博客写道他们在UserVoice上建立了一个讨论 ... -
为非Restful的action准备的插件:static_actions
2009-05-30 10:06 1246如果我们的Rails应用里能够全部Restful,那很cool ... -
Ruby游戏开发利器Gosu
2009-05-16 18:46 3085在2009年的Railsconf大会上,Hongli Lai和 ...
相关推荐
Ruby on Rails中文指南
rails-assets, 在 Rails 中,资产管理的解决 Rails 资产 Bundler 到 Bower 代理本自述文件涉及项目的开发方面。 访问站点了解如何在你的应用程序中使用 Rails 资产。 插件开发设置git clone git@github.com:tenex/r
Ruby On Rails中文教材(PDF)
《应用Rails进行敏捷Web开发》中文第三版,找了很久才找到,介绍的是rails2.2.2
rails指南 中文版
shoppe-example, 在 Rails 中使用Shoppe平台的示例存储实现 这是一个 Rails 应用程序,它使用 Shoppe 构建。 它具有一个可以爱的设计,以充分演示Shoppe平台提供的功能以及它在 Rails 应用程序中的。 正在启动要开始...
敏捷Rails中文教程 敏捷Rails中文教程 敏捷Rails中文教程
rails_email_preview, 在 Rails 中,预览和编辑应用程序邮件程序模板 Rails 电子邮件预览 使用这里 Rails 引擎在浏览器中预览电子邮件。 兼容 Rails 4.2 。电子邮件审阅: 所有电子邮件预览的列表: 代表有两个主题...
使用Aptana+Rails开发Rails Web应用 有Aptana的安装配置等等,中文
Administrate - 一个框架用于在Rails中创建灵活的、强大的管理仪表板
在这个全球互联的世界中,计算机编程和 Web 应用程序开发都在迅猛发展,我很期待能为中国的开发者提供 Ruby on Rails 培训。学习英语这门世界语言是很重要的,但先通过母语学习往往会更有效果。正因为这样,当看到 ...
NULL 博文链接:https://hlee.iteye.com/blog/587000
rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails ...
Ruby on Rails Tutorial 原书第三版中文版
简介 Ruby On Rails 框架自它提出之日...Rails 是一个真正彻底的 MVC(Model-View-Controller) 框架,Rails 清楚地将你的模型的代码与你的控制器的应用逻辑从 View 代码中分离出来。Rails 开发人员很少或者可能从未遇到
入门rails的第一个demo
Bootstrap 3 和 Rails 4(样例用的是Ruby 2.1.1,Rails 4.1.4) Table of Contents Preface 1 Chapter 1: Introducing Web Application Development in Rails 7 Why Bootstrap with Rails? 8 Setting up a Todo ...
bower-rails, 在 Rails 上,为 Bower 设置类似 DSL + rake任务 rails Bower 对 Rails 项目的支持。 依赖文件是 Rails root 目录中的bower.json,如果使用 DSL,则为 Bowerfile 。 查看最新变更和发布的变更日志文件...
《Rails之道》详细讨论了Rails的程序代码并通过分析Rails中的代码片段来深入解释它的功能,同时,《Rails之道》部分章节也摘录了一些API文档中的内容,使读者能够快速地找到对应的API文档、相关的示例代码以及深入...