MỘT SỐ LƯU Ý TỐI ƯU HÓA CÂU LỆNH MYSQL
Qua quá trình làm việc liên tục với hệ quản trị cơ sở dữ liệu MySQL, mình note lại một số tips, câu lệnh SQL hữu ích. Tất nhiên ngoài những câu lênh riêng biệt thì những tips này có thể sử dụng cho cả SQL Server hay một hệ quản trị cơ sở dữ liệu quan hệ phổ biến khác như PosgreSQL
-
Vấn đề sử dụng JOIN, UNION, WHERE
-
Cố gắng sử dụng nhiều nhất có thể INNER JOIN, vì Inner join là câu lệnh tránh dư thừa dữ liệu nhất trong các loại JOIN. Và đặc biệt là nên sử dụng WHERE ở chỗ cần thiết:
Câu query A:
Select a.UserName,
a.FullName,
a.Age,
b.CompanyName
from tb_User as a
inner join tb_Company as b
on b.CompanyID = a.CompanyID
where a.Age > 18
Câu query B:
Select a.UserName,
a.FullName,
a.Age,
b.CompanyName
from tb_User as a, tb_Company as b
where b.CompanyID = a.CompanyID
and a.Age > 18
Trong thực tế thì nếu lượng dữ liệu nhỏ thì 2 câu query A, B mất thời gian như nhau. Nhưng câu lệnh viết kiểu query A sẽ tốt hơn kiểu viết query B.
- UNION, UNION ALL
Tránh sử dụng Union đơn thuần, nếu bắt buộc sử dụng Union thì nên sử dụng UNION ALL.
- EXPLAIN Sau khi viết câu lệnh query để lấy dữ liệu ra, có một bước khá quan trọng để tăng trải nghiệm người dùng là kiểm tra tốc độ nhanh hay chậm của tính năng vừa xây dựng. Bạn có thể sử dụng câu lệnh EXPLAIN để kiểm tra xem câu lệnh của mình tối ưu hay chưa
Ví dụ: Bạn có câu lệnh lấy danh sách tên, tuổi và cơ quan của người dùng lớn hơn 18 tuổi: Select a.UserName, a.FullName, a.Age, b.CompanyName from tb_User as a inner join tb_Company as b on b.CompanyID = a.CompanyID where a.Age > 18
Sau khi hoàn thành câu lệnh nên thử kiểm tra lại xem câu lệnh tối ưu chưa bằng cách chạy lệnh EXPLAIN
EXPLAIN
Select a.UserName,
a.FullName,
a.Age,
b.CompanyName
from tb_User as a
inner join tb_Company as b
on b.CompanyID = a.CompanyID
where a.Age > 18
Để hiểu câu lệnh này sử dụng như thế nào thì bạn tham khảo trang chủ MySQL có nói. Hoặc mình sẽ nêu ra trong một bài khác.
-
DISTINCT, GROUP BY Hạn chế sử dụng DISTINCT, thay vì dùng nó thì chuyển sang GROUP BY nếu có thể, vì câu lệnh Distinct chạy khá tốn bộ nhớ.
-
Vấn đề INDEX dữ liệu Sử dụng Index có thể tăng tốc độ câu truy vấn, nhưng nó sẽ làm cho câu lệnh Update/Insert/Delete bị chậm hơn. Bản chất đánh Index là hệ quản trị sẽ lưu trữ thêm dữ liệu vào bộ nhớ theo một logic để dễ dàng truy xuất các cột có index. Nên dung lượng dữ liệu sẽ phình lên nhiều hơn, và ổ cứng nhanh đầy hơn. Một bảng không nên đánh quá nhiều index.
-
Tham khảo TỐI ƯU HÓA CÂU LỆNH MYSQL - PHẦN 1
-
Tham khảo TỐI ƯU HÓA CÂU LỆNH MYSQL - PHẦN 2
All rights reserved