1 Minute 4 Change

Menu
  • Home
  • Code & Discover
    • Data Engineer
    • SQL
    • Flutter
    • Web Developer
  • Learn something
    • Languages
      • English
  • Chill Zone
    • Novels
      • Giả làm thần linh ở xã hội nguyên thủy
    • Games
    • Videos
  • About
  • Contact
Menu

Làm thế nào để tối ưu hóa hiệu năng của một truy vấn SQL phức tạp?

Posted on Tháng mười một 23, 2024Tháng 12 20, 2024 by Daisy

Mục lục

Toggle
  • 1. Sử dụng Index một cách hiệu quả
  • 2. Tránh sử dụng SELECT
  • 3. Viết truy vấn đơn giản và rõ ràng
  • 4. Sử dụng EXPLAIN hoặc EXPLAIN PLAN
  • 5. Sử dụng LIMIT và phân trang (Pagination)
  • 6. Tối ưu hóa câu lệnh JOIN
  • 7. Tận dụng Partitioning và Sharding
  • 8. Tránh các hàm không cần thiết trong WHERE
  • 9. Sử dụng Materialized Views
  • 10. Cấu hình phần cứng và hệ thống

Tối ưu hóa truy vấn SQL giúp tăng tốc độ thực thi, giảm tài nguyên sử dụng và cải thiện hiệu suất hệ thống.

Khi tối ưu hóa truy vấn SQL:

  1. Sử dụng index hiệu quả.
  2. Tối giản câu lệnh, hạn chế dữ liệu thừa.
  3. Kiểm tra hiệu suất với EXPLAIN.
  4. Kết hợp với các chiến lược phân vùng, caching, và tối ưu hệ thống.

Dưới đây là các bước cụ thể và chiến lược:

1. Sử dụng Index một cách hiệu quả

Index giúp tăng tốc độ tìm kiếm và truy vấn. Hãy tạo index trên các cột thường xuyên xuất hiện trong:

  • Mệnh đề WHERE (lọc dữ liệu).
  • JOIN (liên kết bảng).
  • GROUP BY và ORDER BY (tổ chức và sắp xếp).

Ví dụ:

CREATE INDEX idx_employee_salary ON employees(salary);

Chú ý: Không lạm dụng index vì nó làm tăng chi phí ghi (insert/update/delete).

2. Tránh sử dụng SELECT

Thay vì lấy toàn bộ dữ liệu, chỉ chọn những cột cần thiết. Điều này giảm lượng dữ liệu truyền tải và thời gian xử lý.

Ví dụ:

Không tối ưu:

SELECT * FROM employees;

Tối ưu:

SELECT name, salary FROM employees;

3. Viết truy vấn đơn giản và rõ ràng

  • Sử dụng alias (AS) để làm truy vấn dễ đọc hơn.
  • Nếu có thể, tránh các subquery phức tạp hoặc lồng nhau (nested queries). Thay vào đó, sử dụng JOIN hoặc Common Table Expression (CTE).

Ví dụ:

Không tối ưu:

SELECT * 
FROM employees 
WHERE id IN (SELECT id FROM promotions);

Tối ưu (dùng JOIN):

SELECT e.*
FROM employees e
JOIN promotions p ON e.id = p.id;

4. Sử dụng EXPLAIN hoặc EXPLAIN PLAN

  • EXPLAIN là công cụ phân tích cách truy vấn được thực thi. Nó hiển thị thông tin về các bảng được quét, index được sử dụng, và chi phí tính toán.

Ví dụ:

EXPLAIN SELECT name FROM employees WHERE salary > 5000;

Kiểm tra để đảm bảo truy vấn sử dụng index thay vì full table scan (quét toàn bộ bảng).

5. Sử dụng LIMIT và phân trang (Pagination)

  • Nếu dữ liệu trả về lớn, hãy sử dụng LIMIT hoặc chia nhỏ kết quả thành nhiều trang.

Ví dụ:

SELECT name, salary 
FROM employees 
ORDER BY salary DESC 
LIMIT 10 OFFSET 0; -- Lấy 10 bản ghi đầu tiên

6. Tối ưu hóa câu lệnh JOIN

  • Chọn đúng loại JOIN (INNER JOIN, LEFT JOIN, RIGHT JOIN).
  • Đảm bảo các cột được JOIN có index.
  • Nếu có nhiều bảng, thực hiện JOIN trên các bảng nhỏ trước.

Ví dụ:

Không tối ưu:

SELECT * 
FROM employees e, departments d 
WHERE e.department_id = d.id;

Tối ưu (dùng INNER JOIN):

SELECT e.name, d.department_name 
FROM employees e
INNER JOIN departments d ON e.department_id = d.id;

7. Tận dụng Partitioning và Sharding

  • Partitioning: Chia dữ liệu thành các phân vùng nhỏ hơn (theo ngày, theo ID).
  • Sharding: Chia nhỏ dữ liệu trên nhiều máy chủ (hữu ích với cơ sở dữ liệu lớn).

Ví dụ (Partitioning):

CREATE TABLE employees (
    id INT,
    name VARCHAR(50),
    salary INT,
    hire_date DATE
) PARTITION BY RANGE (hire_date) (
    PARTITION p1 VALUES LESS THAN ('2022-01-01'),
    PARTITION p2 VALUES LESS THAN ('2023-01-01')
);

8. Tránh các hàm không cần thiết trong WHERE

  • Hàm như LOWER(), UPPER(), hoặc CAST() trong WHERE khiến SQL không thể sử dụng index.

Ví dụ:

Không tối ưu:

SELECT * 
FROM employees 
WHERE UPPER(name) = 'JOHN';

Tối ưu:

SELECT * 
FROM employees 
WHERE name = 'John';

Nếu cần so sánh không phân biệt hoa thường, hãy thiết lập collation của cột.

9. Sử dụng Materialized Views

  • Nếu có các truy vấn phức tạp, lặp lại nhiều lần, hãy sử dụng Materialized Views để lưu kết quả tạm. Điều này giúp truy vấn nhanh hơn.

Ví dụ:

CREATE MATERIALIZED VIEW high_salary_employees ASSELECT * FROM employees WHERE salary > 10000;

10. Cấu hình phần cứng và hệ thống

  • Tăng bộ nhớ và CPU: Hữu ích cho các truy vấn phức tạp.
  • Caching: Sử dụng Redis, Memcached để cache kết quả truy vấn thường xuyên.
  • Tối ưu hóa cấu hình cơ sở dữ liệu: Điều chỉnh kích thước buffer pool, số lượng kết nối tối đa.

 

Category: Code & Discover Data Engineer SQL

Điều hướng bài viết

← Một số hướng dẫn và mẹo để viết code HTML tốt.
Một số câu hỏi phỏng vấn phổ biến cho vị trí Data Engineer →

1minute4change.

ABOUT ME

One minute for change, mỗi ngày biết thêm một chút.

RECENT POSTS

  • Tháng 1 30, 2025 by Daisy So sánh báo cáo trong Tableau và BI Publisher
  • Tháng 1 21, 2025 by Daisy CDS (Card Data System) là gì?
  • Tháng 1 19, 2025 by Daisy Data Warehouse (DW), Operational Reporting System (ORS), và Operational Data Store (ODS)

CATEGORIES

  • Chill Zone (5)
  • Code & Discover (17)
  • Learn something (0)
  • Uncategorized (1)

TAG

  • API (2)
  • Bigdata (1)
  • CDS (1)
  • CRM (1)
  • DevOps (1)
  • Gialamthanlinhoxahoinguyenthuy (4)
  • HTML (1)
  • Khongcp (3)
  • Oracle (1)
  • Partition (2)
  • Report (1)
  • SQL (8)
  • WebAPI (1)
  • Xaydung (3)
  • Chill Zone (5)
  • Code & Discover (17)
  • Data Engineer (12)
  • Discover (3)
  • Flutter (1)
  • Novels (5)
  • SQL (11)
  • Uncategorized (1)
  • Web Developer (4)
© 2025 1 Minute 4 Change | Powered by Minimalist Blog WordPress Theme