该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-08-17
http://guide.rails.info/association_basics.html
|
|
返回顶楼 | |
发表时间:2009-08-17
這個更詳細
|
|
返回顶楼 | |
发表时间: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的时候也能够减少数据库查询。 |
|
返回顶楼 | |
发表时间: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的时候也能够减少数据库查询。 请教一下,你这里所说的缓存怎么做? |
|
返回顶楼 | |
发表时间: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的负担。 |
|
返回顶楼 | |
发表时间:2009-08-19
rainchen说的是一种方法,还有一种做法利用memcached的mutil get,这里的查询是通过ActiveRecord::Base.find_some生成的in语句,我们可以alias这个方法,先用mutil get这一系列的id,然后将已经获取的对象id从array中剔除,再用find_some_without_cache查询,这样在缓存命中率不高的情况下,也只会有一句in的查询。
|
|
返回顶楼 | |
发表时间: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! |
|
返回顶楼 | |
发表时间:2009-08-26
这一次比以前写的好:)
|
|
返回顶楼 | |