主页

使用 bullet 解决 n+1 问题

2023-10-13 03:08PM

1. 在 Gemfile 文件中增加 bullet

gem "bullet"

也可以这样:

gem 'bullet', group: 'development' 

运行:

bundle install

使用generate命令启用Bullet gem:

bundle exec rails g bullet:install 

 2. 启动服务器:

bunlde exec rails server 

3. 在浏览器打开 http://localhost:3000/enterprise_personnels  会发现一个弹出警报框,上面写着:

user: meiyi
# 它使用了"eager loading"(急切加载)的技术来提高数据库查询的效率。
USE eager loading detected
  EnterprisePersonnel => [:enterprise]
  Add to your query: .includes([:enterprise])
Call stack
  /home/meiyi/workspace/baogongpingtai-pc/app/views/enterprise_personnels/_manager_index.html.erb:52:in `block in _app_views_enterprise_personnels__manager_index_html_erb___1641263257495167126_98180'
  /home/meiyi/workspace/baogongpingtai-pc/app/views/enterprise_personnels/_manager_index.html.erb:45:in `_app_views_enterprise_personnels__manager_index_html_erb___1641263257495167126_98180'
  /home/meiyi/workspace/baogongpingtai-pc/app/views/enterprise_personnels/index.html.erb:4:in `_app_views_enterprise_personnels_index_html_erb__848786211981055623_98160'

 这意味着从 Enterprise_personnels 对象到它的 enterprise 关联有一个 N+1 查询。

并且在浏览器页面的左下角会显示一个警告:

4. 与此同时,有一个日志附加到 log/bullet.log文件:

user: meiyi
GET /enterprise_personnels
USE eager loading detected
  EnterprisePersonnel => [:enterprise]
  Add to your query: .includes([:enterprise])
Call stack
  /home/meiyi/workspace/baogongpingtai-pc/app/views/enterprise_personnels/_manager_index.html.erb:52:in `block in _app_views_enterprise_personnels__manager_index_html_erb___1641263257495167126_98180'
  /home/meiyi/workspace/baogongpingtai-pc/app/views/enterprise_personnels/_manager_index.html.erb:45:in `_app_views_enterprise_personnels__manager_index_html_erb___1641263257495167126_98180'
  /home/meiyi/workspace/baogongpingtai-pc/app/views/enterprise_personnels/index.html.erb:4:in `_app_views_enterprise_personnels_index_html_erb__848786211981055623_98160'

5. 要修复 N+1 查询,可以更改 app/controllers/enterprise_personnels_controller.rb 文件:

def index
   # 增加下面这一行
  @enterprise_personnels = EnterprisePersonnel.includes(:enterprise)
  @car_count = current_manager.cars.count
   ……
end

6.  在浏览器刷新 http://localhost:3000/enterprise_personnels 页面,会发现,现在没有警报框,日志中也没有新内容。

所以 N+1 查询已修复

返回>>

登录

请登录后再发表评论。

评论列表:

目前还没有人发表评论