0

Debugbar Bài 2: Tab "Queries" - "Bác sĩ siêu âm" cho Database của bạn

Trong quá trình làm việc với Laravel (sử dụng Eloquent ORM), chúng ta thường viết code PHP rất gọn gàng như User::with('posts')->get(). Tuy nhiên, bên dưới lớp màn đó, Laravel phải dịch code này ra các câu lệnh SQL để nói chuyện với cơ sở dữ liệu (Database). Nếu bạn không kiểm soát được Laravel đang chạy câu lệnh SQL nào, trang web của bạn sẽ rất dễ bị chậm khi dữ liệu lớn lên.

Nhìn vào bức ảnh image.png ở bài trước, bạn có thể thấy tab Queries 2. Số 2 màu đỏ báo hiệu rằng để hiển thị trang web này, server đã phải chạy 2 câu lệnh truy vấn vào Database.

1. Các thông tin bạn sẽ thấy trong Tab Queries

Khi bấm vào tab này, bạn sẽ thấy danh sách các câu lệnh SQL. Mỗi dòng sẽ cung cấp cho bạn những thông tin cực kỳ giá trị:

  • Câu lệnh SQL thực tế: Debugbar sẽ hiển thị câu lệnh SQL chính xác đã được chạy (ví dụ: select * from users where id = 1). Các biến truyền vào sẽ được làm nổi bật để bạn dễ đọc.
  • Thời gian thực thi (Duration): Nó cho biết câu lệnh này mất bao nhiêu mili-giây (ms) để hoàn thành.
  • Mẹo: Nếu một câu lệnh chạy quá lâu, Debugbar sẽ bôi đỏ thời gian đó để cảnh báo bạn cần phải tối ưu (thường là bằng cách thêm Index trong Database).
  • Vị trí gọi (File & Line): Đây là cứu cánh cho lập trình viên. Nó chỉ đích danh file PHP nào, ở dòng số mấy đã gọi câu lệnh SQL này. Bạn chỉ cần click vào là biết ngay đoạn code nào đang làm chậm hệ thống.

Connection: Cho biết câu lệnh này đang chạy trên kết nối cơ sở dữ liệu nào (thường là mysql, pgsql hoặc sqlite).

2. Tính năng "ăn tiền" nhất: Phát hiện lỗi N+1 Query

image.png

Là người mới học Laravel, 99% bạn sẽ gặp phải lỗi N+1 Query. Đây là hiện tượng thay vì lấy toàn bộ dữ liệu trong 1 hoặc 2 câu truy vấn, code của bạn lại chạy một vòng lặp và gọi hàng chục, hàng trăm câu truy vấn giống hệt nhau vào Database.

Làm sao để dùng Debugbar bắt lỗi này? Rất đơn giản! Nếu bạn mở tab Queries lên và thấy một danh sách dài dằng dặc các câu lệnh SQL na ná nhau (ví dụ: 50 câu lệnh select * from posts where user_id = ?), và con số trên tab Queries hiện lên màu đỏ chót (ví dụ: Queries 51), thì chúc mừng, bạn đã dính lỗi N+1.

Nhờ có Debugbar hiển thị trực quan như vậy, bạn sẽ biết ngay mình cần sửa code (thường là sử dụng kỹ thuật Eager Loading - hàm with() trong Laravel) để gộp 50 câu lệnh đó lại thành 1 câu duy nhất.

Tóm lại ở Bài 2: Hãy tạo thói quen luôn luôn liếc nhìn con số ở Tab Queries mỗi khi bạn viết xong một chức năng hoặc load một trang web. Hãy cố gắng giữ con số này ở mức thấp nhất có thể.

Ở bài tiếp theo, chúng ta sẽ tìm hiểu về Tab Views và Tab Route/Request nhé!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí