介绍
我有一个使用BackboneJS构建,具有Rails后端的(大多数情况下)单页面应用程序。
由于大部分交互发生在Web应用程序的一个页面上,因此当用户首次访问页面时,我基本上必须从数据库中提取大量信息,进行一次大型深度连接查询。
这导致该页面的加载时间非常长。
object @search
attributes :id, :name, :subscription_limit
# NOTE: Include a list of the members of this search.
child :searchers => :searchers do
attributes :id, :name, :gravatar_icon
end
# Each search has many concepts (there could be over 100 of them).
child :concepts do |search|
attributes :id, :title, :search_id, :created_at
# The person who suggested each concept.
child :suggester => :suggester do
attributes :id, :name, :gravatar_icon
end
# Each concept has many suggestions (approx. 4 each).
node :suggestions do |concept|
# Here I'm scoping suggestions to only ones which meet certain conditions.
partial "suggestions/show", object: concept.active_suggestions
end
# Add a boolean flag to tell if the concept is a favourite or not.
node :favourite_id do |concept|
# Another method call which occurs for each concept.
concept.favourite_id_for(current_user)
end
end
# Each search has subscriptions to certain services (approx. 4).
child :service_subscriptions do
# This contains a few attributes and 2 fairly innocuous method calls.
extends "service_subscriptions/show"
end
看起来我需要采取一些措施,但我不确定应该采取什么方法。以下是我可能有的一些想法:
性能改进思路
简化界面 也许我可以想出一些向用户呈现信息的方法,而不需要实际数据存在。但我不明白为什么一定要这样做,其他单页应用程序(如 Trello)具有非常复杂的界面。
概念分页 如果我对概念进行分页,每次从数据库中提取的数据量将减少。但会产生较差的用户界面。
缓存 目前,刷新页面只会重新从数据库中提取整个搜索。也许我可以缓存应用程序的某些部分,以减少对数据库的访问。但这似乎很混乱,因为我处理的大部分数据都不是静态的。
多个请求 在不将 JSON 嵌入页面的情况下提供页面技术上是不好的,但也许如果我先加载未填充的页面,然后再获取数据,用户会感觉事情发生得更快。
索引
我应该确保所有外键都有索引。我还应该考虑在哪些地方添加索引会有帮助(比如收藏夹?)。
将方法调用移入数据库
也许我可以将视图层中迭代结果的一些缓存放入数据库中,然后只需提取它们而不是计算它们。或者我可以在写入时同步而不是在读取时同步。
问题
有人有关于我应该花时间做什么的建议吗?