论坛首页 编程语言技术论坛

Rails每周一题(十八): Association之魔法

浏览 9188 次
该帖已经被评为良好帖
作者 正文
   发表时间:2009-08-17  
http://guide.rails.info/association_basics.html
0 请登录后投票
   发表时间:2009-08-17  
這個更詳細
0 请登录后投票
   发表时间:2009-08-17  
引用
   2. 很多人以为eager loading是用join来实现的,其实并不是,至少Rails2.2之后不再是。那么,上面那个查询导致了一个很庞大但我们并不需要的数据库查询,即:
SELECT * FROM lightboxes WHERE id IN (....................) 

2.2的这个改动我觉得是个优点,因为这种查询在大部分的情况下性能反而比join查询要好,配合缓存更是能够极大地减少数据库的负担,比如我给light_box加上按id作缓存,查询就会变成:
SELECT * FROM lightboxes WHERE id IN (ids not in cache) 
而查询完以后,还能够将未cache的light_box填充,这样其它代码在通过id获取light_box的时候也能够减少数据库查询。
0 请登录后投票
   发表时间:2009-08-17  
QuakeWang 写道
引用
   2. 很多人以为eager loading是用join来实现的,其实并不是,至少Rails2.2之后不再是。那么,上面那个查询导致了一个很庞大但我们并不需要的数据库查询,即:
SELECT * FROM lightboxes WHERE id IN (....................) 

2.2的这个改动我觉得是个优点,因为这种查询在大部分的情况下性能反而比join查询要好,配合缓存更是能够极大地减少数据库的负担,比如我给light_box加上按id作缓存,查询就会变成:
SELECT * FROM lightboxes WHERE id IN (ids not in cache) 
而查询完以后,还能够将未cache的light_box填充,这样其它代码在通过id获取light_box的时候也能够减少数据库查询。



请教一下,你这里所说的缓存怎么做?
0 请登录后投票
   发表时间:2009-08-18  
andyhu1007 写道
QuakeWang 写道
引用
   2. 很多人以为eager loading是用join来实现的,其实并不是,至少Rails2.2之后不再是。那么,上面那个查询导致了一个很庞大但我们并不需要的数据库查询,即:
SELECT * FROM lightboxes WHERE id IN (....................) 

2.2的这个改动我觉得是个优点,因为这种查询在大部分的情况下性能反而比join查询要好,配合缓存更是能够极大地减少数据库的负担,比如我给light_box加上按id作缓存,查询就会变成:
SELECT * FROM lightboxes WHERE id IN (ids not in cache) 
而查询完以后,还能够将未cache的light_box填充,这样其它代码在通过id获取light_box的时候也能够减少数据库查询。



请教一下,你这里所说的缓存怎么做?


我猜QuakeWang的意思是指利用memcached这样的mem hash db 来做db cache server,只做主键查询缓存,比如:select * from xx where primary_id = 123
那么一个类似:
SELECT * FROM lightboxes WHERE id IN (123,456,789, ...) 
的查询就可以分解为使用多个主键查询:
SELECT * FROM lightboxes WHERE id = 123;
SELECT * FROM lightboxes WHERE id = 456;
SELECT * FROM lightboxes WHERE id = 789;
...

这样所有查询都还是徘徊在db cache server层,不会过问db server,减轻db server的负担。

0 请登录后投票
   发表时间:2009-08-19  
rainchen说的是一种方法,还有一种做法利用memcached的mutil get,这里的查询是通过ActiveRecord::Base.find_some生成的in语句,我们可以alias这个方法,先用mutil get这一系列的id,然后将已经获取的对象id从array中剔除,再用find_some_without_cache查询,这样在缓存命中率不高的情况下,也只会有一句in的查询。
0 请登录后投票
   发表时间:2009-08-19  
QuakeWang 写道
rainchen说的是一种方法,还有一种做法利用memcached的mutil get,这里的查询是通过ActiveRecord::Base.find_some生成的in语句,我们可以alias这个方法,先用mutil get这一系列的id,然后将已经获取的对象id从array中剔除,再用find_some_without_cache查询,这样在缓存命中率不高的情况下,也只会有一句in的查询。


Great!
0 请登录后投票
   发表时间:2009-08-26  
这一次比以前写的好:)
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics