Tối ưu SQL join?
* Bài viết có sử dụng quan điểm/ kiến thức cá nhân, có thể đúng hoặc sai mong nhận được sự đóng góp từ người đọc.
Chắc hẳn hình ảnh bên trên vô cùng quen thuộc đối vơí bất kì developer nào.
Trong phạm vị bài viết này mình xin phép không nhắc lại các khái niệm về join và phân biệt các loại join
Nhưng bạn có tự tin là mình đã sử dụng join đúng cách?
Cùng đi 1 ví dụ nhỏ tí xiú này nhé
Chúng ta có quan hệ sau
"companies" have many "posts"
Lấy ra company trong lĩnh vực "Blockchain" và có post về "NFT"
Chúng ta có query như sau:
SELECT *
FROM companies JOIN articles ON companies.id = posts.company_id
WHERE companies.industry = "Blockchain"
AND post.category = "NFT"
Rất là đơn giản phải không?
Khoan, dừng khoảng chừng là 2 giây.
Khi JOIN như trên, SQL Engine sẽ phải thưc hiện như sau
- JOIN 2 bảng companis và posts. Kết quả như sau:
- Query điều kiện trên bảng đã join. Kết quả:
Mọi chuyện sẽ chẳng co gì để nói cho đến khi lượng dữ liệu tăng lên.
Giả sử. Chúng ta có 100_000 companies, 10_000_000 post.
Kết quả của lệnh join bên trên sẽ là 1 bảng gồm 10_000_000 records. SQL engine sẽ phẩi lọc điều kiện trên 10_000_000 records này. Và thậm chí, nếu server của chúng ta không đủ khoẻ, nó có thể ra đi trong quá trình sending data.
Vậy mình có thể sửa lại query 1 chút
SELECT *
FROM companies
JOIN articles
ON (companies.id = posts.company_id
AND post.category = "NFT")
WHERE companies.industry = "Blockchain"
hoặc
SELECT *
FROM companies
JOIN (SELECT * FROM articles WHERE post.category = "NFT") as f_posts ON (companies.id = f_posts.company_id)
WHERE companies.industry = "Blockchain"
Vơí cách query này, kết quả của phép join đã được thu hẹp lại rất nhiều. Hãy thử tự kiểm chứng xem nhé
Happy coding!