Tối ưu hóa thao tác chèn dữ liệu
- Chèn hàng loạt
INSERT INTO danh_sach_nguoi_dung (ma, ten)
VALUES (101, 'An'), (102, 'Binh'), (103, 'Chau');
- Quản lý giao dịch
BEGIN;
INSERT INTO danh_sach_nguoi_dung VALUES (201, 'Dung'), (202, 'Em'), (203, 'Giang');
INSERT INTO danh_sach_nguoi_dung VALUES (204, 'Huong'), (205, 'Khoa'), (206, 'Linh');
COMMIT;
- Sắp xếp khóa chính
Chèn ngẫu nhiên: 15, 3, 22, 7, 11
Chèn tuần tự: 3, 7, 11, 15, 22
Xử lý dữ liệu khối lượng lớn
-- Kích hoạt chế độ nhập từ file cục bộ
SET GLOBAL local_infile = 1;
-- Tải dữ liệu từ file CSV
LOAD DATA LOCAL INFILE '/data/nguoi_dung.csv'
INTO TABLE danh_sach_nguoi_dung
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n';
Tối ưu khóa chính
- InnoDB tổ chức dữ liệu theo thứ tự khóa chính (Index Organized Table)
- Chèn khóa chính không tuần tự gây phân mảnh trang
- Xóa bản ghi kích hoạt cơ chế gộp trang khi vượt ngưỡng 50%
- Nguyên tắc thiết kế:
- Ưu tiên khóa tự tăng (AUTO_INCREMENT)
- Tránh UUID hoặc khóa tự nhiên
- Tối giản độ dài khóa chính
Tối ưu truy vấn sắp xếp
- Using index: Trả kết quả trực tiếp từ chỉ mục
- Using filesort: Cần sắp xếp bộ nhớ (sort buffer)
- Chiến lược:
- Xây dựng chỉ mục đa cột theo thứ tự sắp xếp
- Sử dụng chỉ mục phủ (covering index)
- Tăng kích thước sort_buffer_size cho tập lớn
Tối ưu phân trang
SELECT s.*
FROM san_pham s
INNER JOIN (SELECT ma_san_pham FROM san_pham ORDER BY ma_san_pham LIMIT 1000000, 20) tmp
ON s.ma_san_pham = tmp.ma_san_pham;
Phân tích COUNT()
- InnoDB: Đếm từng bản ghi (không lưu sẵn số lượng)
- MyISAM: Trả trực tiếp giá trị đã lưu
- Hiệu suất: COUNT(*) ≈ COUNT(1) > COUNT(khóa_chính) > COUNT(trường)
Tối ưu cập nhật
- Khóa hàng chỉ hoạt động khi sử dụng chỉ mục hiệu quả
- Tránh thay đổi giá trị khóa chính
View (Bảng ảo)
Thủ tục lưu trữ
- Khởi tạo
DELIMITER //
CREATE PROCEDURE tao_nguoi_dung(IN so_luong INT)
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i <= so_luong DO
INSERT INTO danh_sach_nguoi_dung(ten) VALUES (CONCAT('User_', i));
SET i = i + 1;
END WHILE;
END //
DELIMITER ;
- Biến cục bộ
DECLARE tong_so INT DEFAULT 0;
SET tong_so = (SELECT COUNT(*) FROM danh_sach_nguoi_dung);
- Biến hệ thống
SHOW VARIABLES LIKE 'max_connections';
SET GLOBAL sort_buffer_size = 1048576;