gpt4 book ai didi

sql - Ruby on Rails 网站运行缓慢;可能是 SQL 查询吗?

转载 作者:太空宇宙 更新时间:2023-11-03 17:29:23 24 4
gpt4 key购买 nike

我一直在开发一个使用 Ruby on Rails 制作的网络应用程序。我已经“完成”了该站点,但是它运行非常 很慢,而且页面有时需要十秒左右才能加载。我将这篇文章分为三个部分:

  1. 概览
  2. 诊断
  3. 可能的想法

概览

作为一个非常粗略的概述,这个网站展示了个人项目,每个项目都有自己的页面。每个项目(我在代码中称之为“帖子”)都存储在一个表中。我不确定将整个帖子存储在数据库中是否是个坏主意,因为有些帖子的正文中包含大量文本和图像。 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 秒的时间。不太好……

Trace feature in Scout

当我点击第二行 (6/17 2:04 PM) 时,它给出了响应时间的分割:

Breakdown of the response time for "/" trace

扩展 SQL 语句表明大部分时间密集型查询来自对帖子数据库的操作,有时对帖子进行排序/排序(见下文)。

Time intensive SQL statements

可能的想法

这里有什么明显的我做错了吗?我很困,不知道如何加快速度。鉴于 Scout 所说的,我有两个想法:

  • Controller 调用的 Controller /SQL 查询很慢
  • 在 HTML 中嵌入 Ruby 代码很慢。

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.publishedposts.published_at 上添加索引。

add_index(:posts, :published)
add_index(:posts, :published_at)

您可以在 What is an index in SQL? 的答案中阅读更多关于索引的信息


使用 Post.allPost.published 意味着将每个帖子从数据库加载到内存中。如果您没有全部使用它们,那就是在浪费大量时间。

例如,在您的索引和主页上显示每篇文章是很笨拙的。相反,您应该使用分页来一次只获取和显示一页帖子。有这样的 gem ,例如 kaminariwill_paginate以及更大的管理解决方案,例如 ActiveAdmin .如果您不喜欢页面链接,环顾四周,您会发现将它们用于“无限滚动”的示例。


最后,您可以添加缓存。由于您的站点不会非常频繁地更新,因此您可以在不同级别进行缓存。通读Caching with Rails: An Overview .

但是缓存带来了它自己的问题。考虑完成基本性能优化后是否需要它。

关于sql - Ruby on Rails 网站运行缓慢;可能是 SQL 查询吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50919320/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com