21. Review 3
🔍 1. Tổng kết kiến thức tuần 3
Tuần này, bạn đã học về các kỹ thuật SQL nâng cao và tối ưu hóa truy vấn, bao gồm:
✅ Chỉ mục (Indexes): Tăng tốc độ truy vấn bằng cách tạo index phù hợp.
✅ Transactions & ACID: Đảm bảo tính nhất quán của dữ liệu khi thực hiện giao dịch.
✅ Stored Procedures & Functions: Viết mã SQL tái sử dụng, giúp tự động hóa truy vấn.
✅ Triggers: Tự động hóa xử lý dữ liệu khi có thay đổi trong bảng.
✅ Views: Tạo bảng ảo giúp đơn giản hóa các truy vấn phức tạp.
✅ Phân tích hiệu suất: Sử dụng EXPLAIN ANALYZE để kiểm tra và tối ưu truy vấn.
📝 2. Bài tập thực hành tổng hợp
🔹 Bài 1: Tạo Index và kiểm tra hiệu suất
Yêu cầu:
- Tạo bảng
ordersvới dữ liệu lớn (~100.000 dòng). - Thêm chỉ mục (
INDEX) vào cộtcustomer_idvà so sánh thời gian truy vấn trước và sau khi tạo index.
Cấu trúc bảng:
CREATE TABLE orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
customer_id INT,
order_date DATETIME,
total_amount DECIMAL(10,2)
);
Tạo dữ liệu mẫu:
INSERT INTO orders (customer_id, order_date, total_amount)
SELECT FLOOR(RAND() * 1000), NOW() - INTERVAL FLOOR(RAND() * 365) DAY, RAND() * 500
FROM generate_series(1, 100000);
Truy vấn kiểm tra hiệu suất:
EXPLAIN ANALYZE
SELECT * FROM orders WHERE customer_id = 500;
Thêm Index:
CREATE INDEX idx_customer_id ON orders(customer_id);
Chạy lại truy vấn và so sánh kết quả.
🔹 Bài 2: Viết Transaction xử lý đặt hàng
Yêu cầu:
- Đảm bảo rằng khi đặt hàng, nếu bất kỳ thao tác nào thất bại, toàn bộ giao dịch phải được hủy (
ROLLBACK). - Cập nhật số lượng tồn kho trong bảng
products.
Cấu trúc bảng:
CREATE TABLE products (
product_id INT PRIMARY KEY AUTO_INCREMENT,
product_name VARCHAR(255),
stock_quantity INT
);
CREATE TABLE orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
customer_id INT,
order_date DATETIME
);
CREATE TABLE order_items (
order_item_id INT PRIMARY KEY AUTO_INCREMENT,
order_id INT,
product_id INT,
quantity INT,
FOREIGN KEY (order_id) REFERENCES orders(order_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
Transaction xử lý đặt hàng:
START TRANSACTION;
INSERT INTO orders (customer_id, order_date) VALUES (123, NOW());
SET @order_id = LAST_INSERT_ID();
INSERT INTO order_items (order_id, product_id, quantity) VALUES (@order_id, 5, 2);
UPDATE products SET stock_quantity = stock_quantity - 2 WHERE product_id = 5;
COMMIT;
Nếu xảy ra lỗi, có thể dùng:
ROLLBACK;