首页 > 解决方案 > Ruby 中的缓存问题

问题描述

我使用 Ruby 构建了我的第一个 Web 应用程序,我注意到在尝试加载每个页面时服务器非常慢。以下行至少重复 10 次:

  CACHE User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", "1299d9c9-e5c9-4e49-b0ff-b986c415eee8"], ["LIMIT", 1]]
  CACHE User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", "1299d9c9-e5c9-4e49-b0ff-b986c415eee8"], ["LIMIT", 1]]
  CACHE User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", "1299d9c9-e5c9-4e49-b0ff-b986c415eee8"], ["LIMIT", 1]]
  CACHE User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", "1299d9c9-e5c9-4e49-b0ff-b986c415eee8"], ["LIMIT", 1]]
  CACHE Entreprise Load (0.0ms)  SELECT  "entreprises".* FROM "entreprises" WHERE "entreprises"."id" = $1 LIMIT $2  [["id", "b50b7beb-7417-4110-b602-660e9ecf067e"], ["LIMIT", 1]]
  CACHE User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", "1299d9c9-e5c9-4e49-b0ff-b986c415eee8"], ["LIMIT", 1]]
  CACHE User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", "1299d9c9-e5c9-4e49-b0ff-b986c415eee8"], ["LIMIT", 1]]
  CACHE User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", "1299d9c9-e5c9-4e49-b0ff-b986c415eee8"], ["LIMIT", 1]]
  CACHE User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", "1299d9c9-e5c9-4e49-b0ff-b986c415eee8"], ["LIMIT", 1]]
  CACHE Entreprise Load (0.0ms)  SELECT  "entreprises".* FROM "entreprises" WHERE "entreprises"."id" = $1 LIMIT $2  [["id", "b50b7beb-7417-4110-b602-660e9ecf067e"], ["LIMIT", 1]]
  CACHE User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", "1299d9c9-e5c9-4e49-b0ff-b986c415eee8"], ["LIMIT", 1]]
[ActionCable] [1299d9c9-e5c9-4e49-b0ff-b986c415eee8] ConferencierChannel stopped streaming from conferencier_channel
  CACHE User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", "1299d9c9-e5c9-4e49-b0ff-b986c415eee8"], ["LIMIT", 1]]
  CACHE User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", "1299d9c9-e5c9-4e49-b0ff-b986c415eee8"], ["LIMIT", 1]]
  CACHE User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", "1299d9c9-e5c9-4e49-b0ff-b986c415eee8"], ["LIMIT", 1]]
  CACHE Entreprise Load (0.0ms)  SELECT  "entreprises".* FROM "entreprises" WHERE "entreprises"."id" = $1 LIMIT $2  [["id", "b50b7beb-7417-4110-b602-660e9ecf067e"], ["LIMIT", 1]]
  CACHE User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", "1299d9c9-e5c9-4e49-b0ff-b986c415eee8"], ["LIMIT", 1]]
  CACHE User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", "1299d9c9-e5c9-4e49-b0ff-b986c415eee8"], ["LIMIT", 1]]
  CACHE User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", "1299d9c9-e5c9-4e49-b0ff-b986c415eee8"], ["LIMIT", 1]]
  CACHE User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", "1299d9c9-e5c9-4e49-b0ff-b986c415eee8"], ["LIMIT", 1]]
  CACHE Entreprise Load (0.0ms)  SELECT  "entreprises".* FROM "entreprises" WHERE "entreprises"."id" = $1 LIMIT $2  [["id", "b50b7beb-7417-4110-b602-660e9ecf067e"], ["LIMIT", 1]]
  CACHE User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", "1299d9c9-e5c9-4e49-b0ff-b986c415eee8"], ["LIMIT", 1]]
  CACHE User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", "1299d9c9-e5c9-4e49-b0ff-b986c415eee8"], ["LIMIT", 1]]
  CACHE User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", "1299d9c9-e5c9-4e49-b0ff-b986c415eee8"], ["LIMIT", 1]]
  CACHE User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", "1299d9c9-e5c9-4e49-b0ff-b986c415eee8"], ["LIMIT", 1]]
  CACHE Entreprise Load (0.0ms)  SELECT  "entreprises".* FROM "entreprises" WHERE "entreprises"."id" = $1 LIMIT $2  [["id", "b50b7beb-7417-4110-b602-660e9ecf067e"], ["LIMIT", 1]]

请问我的代码中有设置吗?

标签: ruby

解决方案


这个问题似乎是 N+1 查询问题 :)

我认为您的控制器中有此代码;

@entrepies = Entrepry.all

并像这样调用视图;

<% @enrepies.each do |entrepry| %>
    <p><%= entrepry.title %></p>
    <p>
        <% entrepry.users.each do |user| %>
            <%= user.name %><br/>
        <% end %>
    </p>
<% end %>

此代码有 n+1 查询问题(每个 entrepry 对象都从数据库调用用户对象,因为用户不包括 entrepries 查询)。您必须在企业查询中加入或包含用户表。像这样;Entrepry.all.includes(:user)


推荐阅读