Tối ưu hiệu suất truy vấn cho MySQL

Post Reply
User avatar
stararound
Posts: 27
Joined: Wed Apr 17, 2019 1:29 pm

Tối ưu hiệu suất truy vấn cho MySQL

Post by stararound »

1. Khuyến nghị sử dụng COUNT (1) thay vì COUNT (*) để tối ưu hóa hiệu suất truy vấn MySQL.

Code: Select all

--Không nên dùng:
SELECT COUNT(*)
FROM mysql_tuning;
 
--Nên dùng:
SELECT COUNT(1)
FROM mysql_tuning;
2. Không bao giờ so sánh NULL với NULL. Hãy xem xét rằng NULL không giống như một chuỗi rỗng hoặc giống như số 0. Ngoài ra NULL không thể không bằng NULL (NULL! = NULL).

Code: Select all

SELECT COUNT(1)
FROM mysql_tuning
WHERE 1 = 1;
 
--Kết quả với điều kiện 1 = 1 câu truy vấn sẽ có kết quả (nếu có data thì kết quả sẽ lớn hơn 0). Nhưng trong trước hợp này có thể bỏ qua điều kiện 1 = 1.
 
SELECT COUNT(1)
FROM mysql_tuning
WHERE NULL = NULL;
 
--Kết quả với điểu kiện NULL = NULL bạn sẽ thu được 0.
 
SELECT COUNT(1)
FROM mysql_tuning
WHERE NULL != NULL;
 
--Kết quả với điều kiện NULL != NULL cũng là 0.

3. Nếu bạn đang sử dụng nhiều bảng, hãy đảm bảo sử dụng table alias.

Code: Select all

SELECT COUNT(1)
FROM mysql_tuning mt, mysql_format mf
WHERE mt.id = mf.id;
4. Bạn nên sử dụng tên cột bảng trong truy vấn MySQL. Như vậy, các câu lệnh SQL sẽ dễ đọc hơn, nhưng đó không phải là lý do chính. Ví dụ: Nếu trong câu lệnh INSERT bạn sử dụng SELECT * FROM my_table và tại một thời điểm nào đó bạn thêm một cột mới trong bảng my_table, SQL sẽ trả về một lỗi. Một lý do khác là sử dụng tên cột bảng sẽ giảm lưu lượng data.

5. Trong câu lệnh WHERE, hãy đảm bảo so sánh phù hợp với kiểu dữ liệu, như chuỗi với chuỗi và số với số, để có hiệu suất truy vấn MySQL tối ưu.

-

Code: Select all

-Không nên dùng:
SELECT id, apn, charging_class
FROM master
WHERE id = '4343';
 
--Nên dùng:
SELECT id, apn, charging_class
FROM master
WHERE id = 4343;
6. Không thay đổi giá trị cột trong mệnh đề WHERE nếu có thể.

Code: Select all

--Không nên dùng:
WHERE CONCAT('(', a.mysql_query_field, ')') = CONCAT('(', b.mysql_query_field, ')')
 
--Nên dùng:
WHERE a.serial_id = b.serial_id
7. Tránh sử dụng các biểu thức phức tạp trong mệnh đề where.

Code: Select all

--Tránh dùng:
WHERE serial_id = SUBSTRING(a.mysql_tuning_field,5)
 
WHERE SUBSTRING(a.mysql_tuning_field,5) = ( 1, etc...)
8. Không sử dụng các function tính toán với các column được lập chỉ mục trong mệnh đề where.

9. EXISTS so với IN cho các truy vấn phụ MySQL


Nếu data chọn lọc nằm trong truy vấn phụ, thì hãy sử dụng IN. Nếu data chọn lọc nằm trong truy vấn chính, thì hãy sử dụng EXISTS.

10. Nên sử dụng câu lệnh CASE. Sẽ hiệu quả hơn nếu chạy một câu lệnh MySQL duy nhất, thay vì hai hoặc nhiều câu lệnh MySQL riêng biệt.

Code: Select all

--Không nên dùng:
SELECT COUNT (1)
  FROM mysql_tuning
 WHERE salary <= 1000;
 
SELECT COUNT (1)
  FROM mysql_tuning
 WHERE salary BETWEEN 1000 AND 2000;
 
--Nên dùng:
SELECT COUNT (CASE WHEN salary <= 1000
                   THEN 1 ELSE null END) count_1,
       COUNT (CASE WHEN salary BETWEEN 1001 AND 2000
                   THEN 1 ELSE null END) count_2
  FROM mysql_tuning;

11. Sử dụng UNION ALL thay vì UNION, nếu có thể.

Code: Select all

--Không nên dùng:
SELECT id, name
  FROM mysql_tuning
 UNION
SELECT id, name
  FROM mysql_tuning_format
 
--Nên dùng:
SELECT id, name
  FROM mysql_tuning
 UNION ALL
SELECT id, name
  FROM mysql_tuning_format
12. Hạn chế sử dụng truy vấn con trong truy vấn MySQL, nếu có thể.

Code: Select all

--Không nên dùng:
SELECT id, manufacturer, model
  FROM cars
 WHERE price = ( SELECT MAX(price)
                   FROM mysql_tuning
               )
   AND year =  ( SELECT MAX(year)
                   FROM mysql_tuning
               )
 
--Nên dùng:
SELECT id, manufacturer, model
  FROM cars
 WHERE (price, year) = ( SELECT MAX(price), MAX(year)
                           FROM mysql_tuning
                       )
13. Khi dữ liệu "trung gian" được sử dụng thường xuyên, bạn nên lưu trữ chúng vào các bảng trung gian.

14. OR so với IN.

Sử dụng IN trong điều kiện WHERE nhanh hơn một chút so với sử dụng OR.

Post Reply