使用作为可标记的 rubygem 优化查询
Posted
技术标签:
【中文标题】使用作为可标记的 rubygem 优化查询【英文标题】:optimize the query using acts-as-taggable-on rubygem 【发布时间】:2013-02-26 22:56:19 【问题描述】:我在我的项目中使用acts-as-taggable-on gem。但是,加载所有标签大约需要 80 秒。
我在 run_controller 中添加了预加载,但它不起作用。 这是一段代码:
def index
@runs = Measurement.includes(:tags).order( "run_name DESC" ).group( :run_name )#.descending #.order_by( :run => 'desc' )
respond_to do |format|
format.html # index.html.erb
format.json render :json => @runs
end
end
我正在使用acts-as-taggable-on 支持的tag_list 来显示标签。因此,在 Measurements 上使用预先加载对性能没有影响。以下两个是stackflow中的相关问题: 1. acts_as_taggable_on: how to optimize the query? 2. Optimizing queries with acts_as_taggable_on
我查看了日志文件,发现最耗时的部分是加载标签,比如
ActsAsTaggableOn::Tag Load (69.9ms) SELECT tags
.* FROM tags
INNER JOIN taggings
ON tags
.id
= taggings
.tag_id
WHERE @987654321.@9876543233 @ = 223866 AND taggings
.taggable_type
= 'Measurement' AND (taggings.context = 'tags' AND taggings.tagger_id IS NULL)
ActsAsTaggableOn::Tag Load (70.2ms) SELECT tags
.* FROM tags
INNER JOIN taggings
ON tags
.id
= taggings
.tag_id
WHERE taggable_id
987654332 @ = 223854 AND taggings
.taggable_type
= '测量' AND (taggings.context = 'tags'
它有数千个查询来加载标签,每个查询花费大约 0.07 秒。 以下代码用于显示标签。
= form_for (run), :remote => true, :method => :put, :html => :class => "myform" do |f|
=f.text_field :tag_list, :class => "tags"
有什么帮助吗?谢谢。
【问题讨论】:
【参考方案1】:我今天才发现这个。只要不使用tag_list
方法,就可以通过tags
关联进行预加载。
提到here和here
【讨论】:
【参考方案2】:已考虑切换到 https://github.com/tmiyamon/acts-as-taggable-array-on 。您需要使用 postgres 作为数据库。
看看这个http://adamnengland.wordpress.com/2014/02/19/benchmarks-acts-as-taggable-on-vs-postgresql-arrays
【讨论】:
以上是关于使用作为可标记的 rubygem 优化查询的主要内容,如果未能解决你的问题,请参考以下文章