SQL Tips: Tối ưu hóa câu lệnh MySQL - Phần 1

Comeback  to write my blog

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



1. 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.


2. 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.


3. 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.


4. 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ớ.


5. 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.


6. Đối với câu lệnh phức tạp, hay phân tích và tách nhỏ thành các câu lệnh đơn giản


...

Nghĩ ra sẽ viết tiếp phần 2 





0 comments:

Đăng nhận xét

Có nhận xét mới

Like