Tối Ưu Hiệu Năng Eloquent

· 3 min read

Eloquent là một ORM mạnh mẽ, nhưng rất dễ mắc sai lầm làm giảm hiệu năng. Dưới đây là các kỹ thuật quan trọng để giữ cho ứng dụng của bạn nhanh.

1. Vấn Đề N+1 Query

Đây là vấn đề hiệu năng phổ biến nhất.

Sai (N+1):

$posts = Post::all(); // Query 1

foreach ($posts as $post) {
    echo $post->author->name; // Query N (một cho mỗi post)
}

Nếu bạn có 100 post, điều này chạy 101 query.

Đúng (Eager Loading):

$posts = Post::with('author')->get(); // Query 1: Posts, Query 2: Authors

foreach ($posts as $post) {
    echo $post->author->name; // Không có query thêm
}

Điều này chỉ chạy đúng 2 query, bất kể số lượng post.

2. Chunking Dữ Liệu Lớn

Đừng load 50.000 bản ghi vào bộ nhớ cùng một lúc.

Sai:

$users = User::all(); // Bộ nhớ tăng vọt!
foreach ($users as $user) {
    // ...
}

Đúng:

User::chunk(100, function ($users) {
    foreach ($users as $user) {
        // ...
    }
});

Điều này xử lý 100 bản ghi mỗi lần, giữ cho việc sử dụng bộ nhớ ổn định.

3. Giới Hạn Các Cột Được Chọn

Đừng select * nếu bạn không cần tất cả dữ liệu, đặc biệt là các cột text/blob.

$users = User::select('id', 'name', 'email')->get();

Lưu ý: Khi eager loading, luôn bao gồm foreign key.

$posts = Post::with('author:id,name')->get(); // 'id' cho phép relationship liên kết

4. Lazy Loading vs Eager Loading

Đôi khi bạn không biết có cần relationship hay không cho đến runtime.

$posts = Post::all();

if ($someCondition) {
    $posts->load('comments'); // Lazy eager loading
}

5. Sử Dụng exists() Thay Vì count()

Để kiểm tra xem bản ghi có tồn tại hay không, đừng đếm tất cả.

Sai:

if (User::where('active', 1)->count() > 0) { ... }

Đúng:

if (User::where('active', 1)->exists()) { ... }

exists() dừng lại sau kết quả đầu tiên.

6. Cache Query

Với dữ liệu ít thay đổi (như cài đặt hoặc danh mục), cache kết quả.

$categories = Cache::remember('categories', 3600, function () {
    return Category::all();
});

Nắm vững các kỹ thuật này đảm bảo ứng dụng Laravel của bạn mở rộng mượt mà khi số lượng người dùng tăng lên.

Bình luận