- vừa được xem lúc

Auto Fix N+1 Queries Bằng Gem jit_preloader

0 0 33

Người đăng: ngọc phạm

Theo Viblo Asia

1. Tổng quan về lỗi N+1

Chúng ta sẽ cùng xem ví dụ bên dưới:

#Model

class Author < ActiveRecord::Base has_many :books
end class Book < ActiveRecord::Base belongs_to :author
end

Chúng ta có 2 model với mối quan hệ 1-n như trên, bây giờ, giả sử ta muốn hiển thị 1 danh sách books, kèm theo thông tin author

#Controller

@books = Book.order(:name)

#View

@books.each do |book| <h1><%= book.name %></h1> <p><%= book.author.name %></p>
end

Lúc này, rails sẽ sinh ra hàng loạt câu query để lấy thông tin book, đại loại như:

Book Load (0.4ms) SELECT "books".* FROM "books" ORDER BY "books"."name" ASC LIMIT $1
Author Load (0.1ms) SELECT "authors".* FROM "authors" WHERE "authors"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]]
Author Load (0.1ms) SELECT "authors".* FROM "authors" WHERE "authors"."id" = $1 LIMIT $2 [["id", 2], ["LIMIT", 1]]
Author Load (0.1ms) SELECT "authors".* FROM "authors" WHERE "authors"."id" = $1 LIMIT $2 [["id", 3], ["LIMIT", 1]]
Author Load (0.1ms) SELECT "authors".* FROM "authors" WHERE "authors"."id" = $1 LIMIT $2 [["id", 4], ["LIMIT", 1]]
Author Load (0.1ms) SELECT "authors".* FROM "authors" WHERE "authors"."id" = $1 LIMIT $2 [["id", 5], ["LIMIT", 1]]
Author Load (0.1ms) SELECT "authors".* FROM "authors" WHERE "authors"."id" = $1 LIMIT $2 [["id", 6], ["LIMIT", 1]]
Author Load (0.1ms) SELECT "authors".* FROM "authors" WHERE "authors"."id" = $1 LIMIT $2 [["id", 7], ["LIMIT", 1]]

Cứ có bao nhiêu record Book, sẽ sinh ra bấy nhiêu câu query Author, đây chính là ví dụ về N+1 queries, đối với khối lượng dữ liệu lớn thì điều này thật đáng sợ.

Để xử lý vấn đề này, Rails có cung cấp cho chúng ta một số method như includes, preload, eager_load. Tuy nhiên, thật tai hại là không phải lúc nào anh em coder chúng mình cũng nhận ra được sự hiện diện của N+1 trong hệ thống của mình @@.

2. Gem jit_preloader

Gem jit_preloader cung cấp một "magic bullet" có thể loại bỏ hầu hết các truy vấn N + 1 trong ứng dụng của bạn.

Cài đặt

Thêm dòng này vào Gemfile của ứng dụng của bạn:

gem 'jit_preloader'

Và sau đó thực hiện:

$ bundle install

Hoặc tự cài đặt nó:

$ gem install jit_preloader

Kích hoạt jit_preloader bằng cách thêm dòng này vào config/initializer/jit_preloader.rb

JitPreloader.globally_enabled = true

Vậy là xong, Bạn không cần sử dụng includes, preload hoặc eager_load nữa. Bạn sẽ không cần phải kiểm tra mã để tìm ra những liên kết nào đang được sử dụng hoặc để tìm N + 1 truy vấn ẩn. Tất cả đều được xử lý tự động và nó sẽ chỉ tải trước liên kết nếu bạn sử dụng nó. Bạn sẽ luôn tải trước lượng dữ liệu phù hợp chính xác.

3. Kết luận

Với gem jit_preloader, bạn đã có thể làm bay màu đống lỗi N+1 có tồn tại trong source code của mình rồi 😍. Tuy nhiên, vẫn có những trường hợp đặt biệt mà gem này không xử lý được, lúc đó phải trông cậy vào bản thân bạn rồi 😃.

Tài liệu tham khảo

https://github.com/clio/jit_preloader

https://www.aha.io/engineering/articles//2021-06-30-90-percent-of-rails-n-plus-one-queries-solved-with-a-drop-in-fix

Bình luận

Bài viết tương tự

- vừa được xem lúc

Giới thiệu Typescript - Sự khác nhau giữa Typescript và Javascript

Typescript là gì. TypeScript là một ngôn ngữ giúp cung cấp quy mô lớn hơn so với JavaScript.

0 0 510

- vừa được xem lúc

Cài đặt WSL / WSL2 trên Windows 10 để code như trên Ubuntu

Sau vài ba năm mình chuyển qua code trên Ubuntu thì thật không thể phủ nhận rằng mình đã yêu em nó. Cá nhân mình sử dụng Ubuntu để code web thì thật là tuyệt vời.

0 0 383

- vừa được xem lúc

Đặt tên commit message sao cho "tình nghĩa anh em chắc chắn bền lâu"????

. Lời mở đầu. .

1 1 715

- vừa được xem lúc

Tìm hiểu về Resource Controller trong Laravel

Giới thiệu. Trong laravel, việc sử dụng các route post, get, group để gọi đến 1 action của Controller đã là quá quen đối với các bạn sử dụng framework này.

0 0 343

- vừa được xem lúc

Phân quyền đơn giản với package Laravel permission

Như các bạn đã biết, phân quyền trong một ứng dụng là một phần không thể thiếu trong việc phát triển phần mềm, dù đó là ứng dụng web hay là mobile. Vậy nên, hôm nay mình sẽ giới thiệu một package có thể giúp các bạn phân quyền nhanh và đơn giản trong một website được viết bằng PHP với framework là L

0 0 432

- vừa được xem lúc

Bạn đã biết các tips này khi làm việc với chuỗi trong JavaScript chưa ?

Hi xin chào các bạn, tiếp tục chuỗi chủ đề về cái thằng JavaScript này, hôm nay mình sẽ giới thiệu cho các bạn một số thủ thuật hay ho khi làm việc với chuỗi trong JavaScript có thể bạn đã hoặc chưa từng dùng. Cụ thể như nào thì hãy cùng mình tìm hiểu trong bài viết này nhé (go).

0 0 423