Tối ưu hóa hiệu năng SQL giúp cải thiện tốc độ truy vấn và hiệu quả sử dụng tài nguyên cơ sở dữ liệu. Dưới đây là một số cách tối ưu hóa phổ biến:
WHERE
, JOIN
, ORDER BY
, và GROUP BY
.CREATE INDEX idx_user_email ON users (email);
Chỉ chọn các cột cần thiết thay vì SELECT * để giảm tải cho cơ sở dữ liệu.
-- Không nên
SELECT * FROM users;
-- Nên
SELECT id, email, name FROM users;
Sử dụng prepared statements để cải thiện hiệu suất và bảo mật.
String sql = "SELECT * FROM users WHERE email = ?";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, "example@example.com");
ResultSet rs = stmt.executeQuery();
Sử dụng các cột có chỉ mục khi thực hiện JOIN.
Chọn kiểu JOIN phù hợp, tránh OUTER JOIN nếu có thể.
SELECT u.name, o.order_id
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
Tránh sử dụng các hàm SQL như LOWER(), UPPER() trong điều kiện WHERE.
-- Không nên
SELECT * FROM users WHERE LOWER(email) = 'example@example.com';
-- Nên
SELECT * FROM users WHERE email = 'example@example.com';
Giảm tải truy vấn bằng cách phân trang (pagination).
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 20;
Dùng EXPLAIN để hiểu cách cơ sở dữ liệu thực hiện truy vấn và tìm ra các nút thắt cổ chai.
EXPLAIN SELECT * FROM users WHERE email = 'example@example.com';
Chỉ sử dụng DISTINCT khi cần loại bỏ bản ghi trùng lặp.
-- Không nên
SELECT DISTINCT name FROM users;
-- Nên
SELECT name FROM users;
Sử dụng cơ chế bộ nhớ đệm để lưu trữ các kết quả truy vấn phổ biến.
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.jcache.JCacheRegionFactory
Thay thế subquery bằng JOIN hoặc EXISTS khi có thể.
-- Không nên
SELECT * FROM users WHERE id IN (SELECT user_id FROM orders);
-- Nên
SELECT u.* FROM users u JOIN orders o ON u.id = o.user_id;
Chia bảng thành các phân vùng nhỏ hơn để tăng tốc độ truy xuất dữ liệu.
CREATE TABLE orders (
id BIGINT,
order_date DATE
)
PARTITION BY RANGE (order_date) (
PARTITION p0 VALUES LESS THAN ('2023-01-01'),
PARTITION p1 VALUES LESS THAN ('2024-01-01')
);
Sử dụng UNION ALL khi không cần loại bỏ các bản ghi trùng lặp.
-- Không nên
SELECT name FROM employees UNION SELECT name FROM managers;
-- Nên
SELECT name FROM employees UNION ALL SELECT name FROM managers;
Sử dụng điều kiện WHERE để chỉ lấy dữ liệu cần thiết.
-- Không nên
SELECT * FROM orders;
-- Nên
SELECT * FROM orders WHERE order_date >= '2024-01-01';
Kiểm tra và tối ưu hóa các trigger và stored procedure để giảm thời gian thực thi.
Tối ưu hóa SQL không chỉ giúp cải thiện hiệu suất truy vấn mà còn giúp sử dụng tài nguyên hiệu quả hơn. Áp dụng các kỹ thuật tối ưu hóa này để tăng hiệu quả và độ tin cậy của ứng dụng.