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!