如果我这样做
post = Post.find_by_id(post_id,:include => :comments)
执行两个查询(一个用于帖子数据,另一个用于帖子的注释).然后当我做post.comments时,不执行另一个查询,因为数据已被缓存.
解决方法
不,那里没有.这是以下行为:包括,因为JOIN方法最终没有效率.
例如,考虑以下情况:Post模型有3个字段,您需要选择,2个字段为注释,这个特定的帖子有100个注释. Rails可以运行单个JOIN查询,方式如下:
SELECT post.id,post.title,post.author_id,comment.id,comment.body FROM posts INNER JOIN comments ON comment.post_id = post.id WHERE post.id = 1
这将返回以下结果表:
post.id | post.title | post.author_id | comment.id | comment.body ---------+------------+----------------+------------+-------------- 1 | Hello! | 1 | 1 | First! 1 | Hello! | 1 | 2 | Second! 1 | Hello! | 1 | 3 | Third! 1 | Hello! | 1 | 4 | Fourth! ...96 more...
你可以看到问题了.单查询JOIN方法虽然返回您需要的数据,但会以冗余方式返回.当数据库服务器将结果集发送到Rails时,它会将帖子的ID,标题和作者ID发送到每个100次.现在,假设邮政有10个你感兴趣的领域,其中8个是文本块.好恶.这是很多数据.将数据从数据库传输到Rails在cpu周期和RAM两方面都能正常工作,因此最小化数据传输对于使应用程序运行速度更快,更精简是至关重要的.
Rails开发人员掌握了数字,大多数应用程序在使用多个查询时运行得更好,这些查询只能获取每一位数据一次,而不是一个有潜力获得巨大冗余的查询.
当然,为了运行复杂的条件,有必要加入一个开发人员的时间,并且可以通过以下方法来实现:include with:join.然而,对于预取关系,Rails所采用的方法:include对性能要好得多.