Spree 扩展中获取关键字分类单元的查询性能缓慢
Slow query performance fetching keyword taxons in Spree extension
我正在努力为现有的 Spree 定制照片冲印店添加功能,以允许摄影师上传他们的作品集并通过网站销售照片。我创建了一个 select2 文本字段,用于使用 Spree::Taxon(s) 向产品添加关键字,它工作正常。我有用于添加站点支持的每种语言(英语和法语)的关键字的字段。
但是,ajax 查询需要很长时间才能完成(平均 5-15 秒)。 ActiveRecord 查询需要 5-150 毫秒才能完成,而视图渲染只需 60 毫秒即可完成。我无法计算剩余的加载时间。有没有人有关于加快 return 结果的建议,或者完成所需额外时间背后的原因是什么?
对数据库使用 MySQL,Ruby 2.2.1 和 Rails 4.2.1。我的开发环境是:Mac Mini(8gb 内存,HDD),Aptana Studio IDE,localhost:3000 上的服务器 运行。
请不要犹豫,索取更多澄清信息!我不确定 post 我到底需要什么来帮助解决我的问题。
控制器到 return JSON 的 ajax 请求:
class KeywordTagsController < Spree::StoreController
respond_to :json
def find_keywords
term = params[:q]
Rails.logger.debug params.inspect
if params[:locale_str]
query = []
query = ["spree_taxons.name like ?", term + '%'] if term
locale = params[:locale_str].to_sym
keyword_taxonomy = Spree::Taxonomy.find_by(name: Spree.t("pi-taxonomy-keyword"))
keyword_taxons = keyword_taxonomy.taxons.with_translations(locale).where(query).order('name asc').select{ |t| t.parent_id != nil} if locale
respond_with keyword_taxons if keyword_taxons
end
end
end
选择 2 初始值设定项Javascript:
$("#keywords_en").select2({
createSearchChoice: function(term, data) {
if ($(data).filter(function() {
return this.text.localeCompare(term) === 0;
}).length === 0) {
return {
id: term,
text: term
};
}
},
multiple: true,
ajax: {
url: '/keywords/en',
dataType: 'json',
data: function (params) {
return {
q: params // search term
};
},
results: function(data){
return { results: $.map( data, function (keyword, i) {
return {id: keyword.id, text: keyword.name }
})}
}
},
tags: true,
tokenSeparators: [','],
placeholder: '<%= Spree.t('pi-keywords-placeholder-en') %>',
initSelection: function (element, callback) {
var data = [];
function splitVal(string, separator) {
var val, i, l;
if (string === null || string.length < 1) return [];
val = string.split(separator);
for (i = 0, l = val.length; i < l; i = i + 1) val[i] = $.trim(val[i]);
return val;
}
$(splitVal(element.val(), ",")).each(function () {
data.push({
id: this,
text: this
});
});
callback(data);
}
});
请求的一些控制台输出(一些较快的示例):
15:00:51 INFO: Processing by KeywordTagsController#find_keywords as JSON
15:00:51 INFO: Parameters: {"q"=>"", "_"=>"1436986845195", "locale_str"=>"fr"}
15:00:54 INFO: Completed 200 OK in 2870ms (Views: 40.6ms | ActiveRecord: 5.2ms)
15:33:45 INFO: Started GET "/keywords/fr?q=mer&_=1436986845196" for 127.0.0.1 at 2015-07-15 15:33:45 -0400
15:33:48 INFO: Processing by KeywordTagsController#find_keywords as JSON
15:33:48 INFO: Parameters: {"q"=>"mer", "_"=>"1436986845196", "locale_str"=>"fr"}
15:33:50 INFO: Completed 200 OK in 2136ms (Views: 5.4ms | ActiveRecord: 113.4ms)
15:33:58 INFO: Started GET "/keywords/fr?q=&_=1436986845197" for 127.0.0.1 at 2015-07-15 15:33:58 -0400
15:33:58 INFO: Processing by KeywordTagsController#find_keywords as JSON
15:33:58 INFO: Parameters: {"q"=>"", "_"=>"1436986845197", "locale_str"=>"fr"}
15:34:00 INFO: Completed 200 OK in 1885ms (Views: 38.7ms | ActiveRecord: 4.6ms)
事实证明,获取查询结果很慢,因为我在开发环境中。在生产中,它以人们期望的速度工作。我发布这个答案以防其他人有同样的问题!
我正在努力为现有的 Spree 定制照片冲印店添加功能,以允许摄影师上传他们的作品集并通过网站销售照片。我创建了一个 select2 文本字段,用于使用 Spree::Taxon(s) 向产品添加关键字,它工作正常。我有用于添加站点支持的每种语言(英语和法语)的关键字的字段。
但是,ajax 查询需要很长时间才能完成(平均 5-15 秒)。 ActiveRecord 查询需要 5-150 毫秒才能完成,而视图渲染只需 60 毫秒即可完成。我无法计算剩余的加载时间。有没有人有关于加快 return 结果的建议,或者完成所需额外时间背后的原因是什么?
对数据库使用 MySQL,Ruby 2.2.1 和 Rails 4.2.1。我的开发环境是:Mac Mini(8gb 内存,HDD),Aptana Studio IDE,localhost:3000 上的服务器 运行。
请不要犹豫,索取更多澄清信息!我不确定 post 我到底需要什么来帮助解决我的问题。
控制器到 return JSON 的 ajax 请求:
class KeywordTagsController < Spree::StoreController
respond_to :json
def find_keywords
term = params[:q]
Rails.logger.debug params.inspect
if params[:locale_str]
query = []
query = ["spree_taxons.name like ?", term + '%'] if term
locale = params[:locale_str].to_sym
keyword_taxonomy = Spree::Taxonomy.find_by(name: Spree.t("pi-taxonomy-keyword"))
keyword_taxons = keyword_taxonomy.taxons.with_translations(locale).where(query).order('name asc').select{ |t| t.parent_id != nil} if locale
respond_with keyword_taxons if keyword_taxons
end
end
end
选择 2 初始值设定项Javascript:
$("#keywords_en").select2({
createSearchChoice: function(term, data) {
if ($(data).filter(function() {
return this.text.localeCompare(term) === 0;
}).length === 0) {
return {
id: term,
text: term
};
}
},
multiple: true,
ajax: {
url: '/keywords/en',
dataType: 'json',
data: function (params) {
return {
q: params // search term
};
},
results: function(data){
return { results: $.map( data, function (keyword, i) {
return {id: keyword.id, text: keyword.name }
})}
}
},
tags: true,
tokenSeparators: [','],
placeholder: '<%= Spree.t('pi-keywords-placeholder-en') %>',
initSelection: function (element, callback) {
var data = [];
function splitVal(string, separator) {
var val, i, l;
if (string === null || string.length < 1) return [];
val = string.split(separator);
for (i = 0, l = val.length; i < l; i = i + 1) val[i] = $.trim(val[i]);
return val;
}
$(splitVal(element.val(), ",")).each(function () {
data.push({
id: this,
text: this
});
});
callback(data);
}
});
请求的一些控制台输出(一些较快的示例):
15:00:51 INFO: Processing by KeywordTagsController#find_keywords as JSON
15:00:51 INFO: Parameters: {"q"=>"", "_"=>"1436986845195", "locale_str"=>"fr"}
15:00:54 INFO: Completed 200 OK in 2870ms (Views: 40.6ms | ActiveRecord: 5.2ms)
15:33:45 INFO: Started GET "/keywords/fr?q=mer&_=1436986845196" for 127.0.0.1 at 2015-07-15 15:33:45 -0400
15:33:48 INFO: Processing by KeywordTagsController#find_keywords as JSON
15:33:48 INFO: Parameters: {"q"=>"mer", "_"=>"1436986845196", "locale_str"=>"fr"}
15:33:50 INFO: Completed 200 OK in 2136ms (Views: 5.4ms | ActiveRecord: 113.4ms)
15:33:58 INFO: Started GET "/keywords/fr?q=&_=1436986845197" for 127.0.0.1 at 2015-07-15 15:33:58 -0400
15:33:58 INFO: Processing by KeywordTagsController#find_keywords as JSON
15:33:58 INFO: Parameters: {"q"=>"", "_"=>"1436986845197", "locale_str"=>"fr"}
15:34:00 INFO: Completed 200 OK in 1885ms (Views: 38.7ms | ActiveRecord: 4.6ms)
事实证明,获取查询结果很慢,因为我在开发环境中。在生产中,它以人们期望的速度工作。我发布这个答案以防其他人有同样的问题!