- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我一直在开发一个使用 Ruby on Rails 制作的网络应用程序。我已经“完成”了该站点,但是它运行非常 很慢,而且页面有时需要十秒左右才能加载。我将这篇文章分为三个部分:
概览
作为一个非常粗略的概述,这个网站展示了个人项目,每个项目都有自己的页面。每个项目(我在代码中称之为“帖子”)都存储在一个表中。我不确定将整个帖子存储在数据库中是否是个坏主意,因为有些帖子的正文中包含大量文本和图像。 posts
表中的每个条目都具有以下属性:
# == Schema Information
#
# Table name: posts
#
# id :integer not null, primary key
# title :string
# body :text
# description :text
# slug :string
# created_at :datetime not null
# updated_at :datetime not null
# image_file_name :string
# image_content_type :string
# image_file_size :integer
# image_updated_at :datetime
# thumbnail_file_name :string
# thumbnail_content_type :string
# thumbnail_file_size :integer
# thumbnail_updated_at :datetime
# published :boolean default("f")
# published_at :datetime
#
诊断
我正在使用 Heroku 来托管应用程序。我已经升级到 Hobby level dynos,所以我可以访问他们提供的一些指标,比如吞吐量、内存使用等。我不认为 Heroku 是让网站变慢的原因,而是我的代码。为了调试,我添加了第三方插件 Scout ,跟踪应用程序中的瓶颈。
Scout 提供了一种跟踪功能,可以量化哪些代码路径在应用程序中花费的时间最多。您可以在下方(图片的下半部分)看到大量的轨迹需要超过 10 秒的时间。不太好……
当我点击第二行 (6/17 2:04 PM) 时,它给出了响应时间的分割:
扩展 SQL 语句表明大部分时间密集型查询来自对帖子数据库的操作,有时对帖子进行排序/排序(见下文)。
可能的想法
这里有什么明显的我做错了吗?我很困,不知道如何加快速度。鉴于 Scout 所说的,我有两个想法:
Controller 调用的 Controller /SQL 查询很慢:
下面的代码显示了我在 PostsController
中分配 @posts
的代码。 home
方法在用户访问 home page 时运行。 ,当用户转到 posts page 时运行 index
方法.这些查询是否会因为数据库中有大量数据(5 个帖子的文本和图像)而变慢?
class PostsController < ApplicationController
#before_action :authenticate_user!
before_action :set_post, only: [:show, :edit, :update, :destroy, :publish, :unpublish]
def home
@posts = Post.all.published.order('published_at DESC')
end
# GET /posts
# GET /posts.json
def index
if user_signed_in? and current_user.admin
@posts = Post.all.order("id")
else
@posts = Post.all.published
end
end
HTML 中的嵌入式 Ruby 代码很慢:
我在我的一些 HTML 代码中使用 Ruby 按日期对帖子进行排序并确定最新的帖子。例如,在网站的侧边栏(home页面的左侧),有一个部分显示“最近”,其背后的逻辑是:
<h4 style="border-bottom: 1px solid #bbb">Recent</h4>
<% @post=Post.all.published.order("published_at").last %>
<% if @post == nil or @post.published_at == nil %>
<div class="temp_sidebar">Coming Soon!</div>
<% else %>
<%= render partial: "layouts/media", locals: {post: @post} %>
<% end %>
同样,在侧边栏的“存档”部分,我按日期对帖子进行排序,并执行以下逻辑:
<% if Post.published.length != 0 %>
<h4>Archives</h4>
<div id="sidebar" class="list-group">
<% @published_posts = Post.published %>
<% archives = Hash.new(0) %>
<% @published_posts.each do |post| %>
<% if archives[post.date] == 0 %>
<% archives[post.date] = 1%>
<% else %>
<% archives[post.date] += 1 %>
<% end %>
<% end %>
<% archives.each do |key, value| %>
<button class="accordion"><%= key %> <span class="badge"> <%= value %></span></button>
<div class="panel">
<% @published_posts.each do |post| %>
<% if post.date == key %>
<p><%= link_to post.title, post_path(@post) %></p>
<% end %>
<% end %>
</div>
<% end %>
</div>
<% end %>
我的想法是,遍历帖子可能会花费很长时间,但我不完全确定。我觉得这是可以使用的有效代码,但也许它的某些方面非常慢。你们有什么想法吗?在这里还需要注意的是,该应用程序的内存使用率相当高:大约 500MB。也许这些查询很慢,因为要获取所有数据,但话虽如此,我不太确定对于这样的网络应用程序来说,“大量”数据是多少。当然,我关于为什么这个网站速度慢的假设可能是完全错误的,所以我非常愿意接受你的想法。最后,如果我使用的 SQL 查询/代码很慢,有什么方法可以加快它的速度/提高它的性能?提前感谢您的帮助!
最佳答案
我看到两个问题:缺少 SQL 索引,以及对 Post.all
的调用过多。
您的慢速查询涉及 WHERE published = ?
。如果 posts.published
没有被索引,这将不得不扫描整个表,而不仅仅是已发布的帖子。您还倾向于按 posts.published_at
排序,如果没有索引,这也会很慢。
要解决此问题,请在迁移中的 posts.published
和 posts.published_at
上添加索引。
add_index(:posts, :published)
add_index(:posts, :published_at)
您可以在 What is an index in SQL? 的答案中阅读更多关于索引的信息
使用 Post.all
或 Post.published
意味着将每个帖子从数据库加载到内存中。如果您没有全部使用它们,那就是在浪费大量时间。
例如,在您的索引和主页上显示每篇文章是很笨拙的。相反,您应该使用分页来一次只获取和显示一页帖子。有这样的 gem ,例如 kaminari和 will_paginate以及更大的管理解决方案,例如 ActiveAdmin .如果您不喜欢页面链接,环顾四周,您会发现将它们用于“无限滚动”的示例。
最后,您可以添加缓存。由于您的站点不会非常频繁地更新,因此您可以在不同级别进行缓存。通读Caching with Rails: An Overview .
但是缓存带来了它自己的问题。考虑在完成基本性能优化后是否需要它。
关于sql - Ruby on Rails 网站运行缓慢;可能是 SQL 查询吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50919320/
我有三张 table 。表 A 有选项名称(即颜色、尺寸)。表 B 有选项值名称(即蓝色、红色、黑色等)。表C通过将选项名称id和选项名称值id放在一起来建立关系。 我的查询需要显示值和选项的名称,而
在mysql中,如何计算一行中的非空单元格?我只想计算某些列之间的单元格,比如第 3-10 列之间的单元格。不是所有的列...同样,仅在该行中。 最佳答案 如果你想这样做,只能在 sql 中使用名称而
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
我正在为版本7.6进行Elasticsearch查询 我的查询是这样的: { "query": { "bool": { "should": [ {
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
是否可以编写一个查询来检查任一子查询(而不是一个子查询)是否正确? SELECT * FROM employees e WHERE NOT EXISTS (
我找到了很多关于我的问题的答案,但问题没有解决 我有表格,有数据,例如: Data 1 Data 2 Data 3
以下查询返回错误: 查询: SELECT Id, FirstName, LastName, OwnerId, PersonEmail FROM Account WHERE lower(PersonEm
以下查询返回错误: 查询: SELECT Id, FirstName, LastName, OwnerId, PersonEmail FROM Account WHERE lower(PersonEm
我从 EditText 中获取了 String 值。以及提交查询的按钮。 String sql=editQuery.getText().toString();// SELECT * FROM empl
我有一个或多或少有效的查询(关于结果),但处理大约需要 45 秒。这对于在 GUI 中呈现数据来说肯定太长了。 所以我的需求是找到一个更快/更高效的查询(几毫秒左右会很好)我的数据表大约有 3000
这是我第一次使用 Stack Overflow,所以我希望我以正确的方式提出这个问题。 我有 2 个 SQL 查询,我正在尝试比较和识别缺失值,尽管我无法将 NULL 字段添加到第二个查询中以识别缺失
什么是动态 SQL 查询?何时需要使用动态 SQL 查询?我使用的是 SQL Server 2005。 最佳答案 这里有几篇文章: Introduction to Dynamic SQL Dynami
include "mysql.php"; $query= "SELECT ID,name,displayname,established,summary,searchlink,im
我有一个查询要“转换”为 mysql。这是查询: select top 5 * from (select id, firstName, lastName, sum(fileSize) as To
通过我的研究,我发现至少从 EF 4.1 开始,EF 查询上的 .ToString() 方法将返回要运行的 SQL。事实上,这对我来说非常有用,使用 Entity Framework 5 和 6。 但
我在构造查询来执行以下操作时遇到问题: 按activity_type_id过滤联系人,仅显示最近事件具有所需activity_type_id或为NULL(无事件)的联系人 表格结构如下: 一个联系人可
如何让我输入数据库的信息在输入数据 5 分钟后自行更新? 假设我有一张 table : +--+--+-----+ |id|ip|count| +--+--+-----+ |
我正在尝试搜索正好是 4 位数字的 ID,我知道我需要使用 LENGTH() 字符串函数,但找不到如何使用它的示例。我正在尝试以下(和其他变体)但它们不起作用。 SELECT max(car_id)
我有一个在 mysql 上运行良好的 sql 查询(查询 + 连接): select sum(pa.price) from user u , purchase pu , pack pa where (
我是一名优秀的程序员,十分优秀!