Khi chèn nhiều hàng cùng lúc, bọc các lệnh INSERT trong một Transaction (START TRANSACTION ... COMMIT) giúp tăng hiệu năng đáng kể bằng cách giảm I/O ghi log.
Cú pháp
START TRANSACTION;
INSERT INTO tên_bảng (cột1, cột2, ...) VALUES
(giá_trị1, giá_trị2, ...),
(giá_trị1, giá_trị2, ...),
...;
COMMIT;
Ví dụ minh họa
Tạo bảng demo:
mysql> CREATE TABLE insertDemo (
-> StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> StudentName VARCHAR(20),
-> StudentAge INT
-> );
Query OK, 0 rows affected (0.72 sec)
Chèn 6 hàng trong một transaction:
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO insertDemo(StudentName, StudentAge) VALUES
-> ('John', 21), ('Carol', 22), ('Bob', 21), ('David', 24),
-> ('Maxwell', 25), ('Mike', 22);
Query OK, 6 rows affected (0.00 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql> COMMIT;
Query OK, 0 rows affected (0.14 sec)
Kiểm tra kết quả:
mysql> SELECT * FROM insertDemo;
+-----------+-------------+------------+ | StudentId | StudentName | StudentAge | +-----------+-------------+------------+ | 1 | John | 21 | | 2 | Carol | 22 | | 3 | Bob | 21 | | 4 | David | 24 | | 5 | Maxwell | 25 | | 6 | Mike | 22 | +-----------+-------------+------------+
Tại sao Transaction nhanh hơn?
- InnoDB ghi log redo log một lần khi COMMIT thay vì sau mỗi INSERT
- Giảm fsync() gọi hệ điều hành
- Buffer pool flush hiệu quả hơn
Các kỹ thuật tăng tốc INSERT khác
| Kỹ thuật | Mô tả |
|---|---|
| Multi-row INSERT | Một lệnh INSERT nhiều VALUES (như ví dụ) |
| LOAD DATA INFILE | Nhanh nhất cho file CSV/Text lớn |
| Tắt index tạm thời | ALTER TABLE ... DISABLE KEYS (chỉ MyISAM) |
| Bulk insert buffer | Tăng innodb_sort_buffer_size, innodb_log_file_size |
| Partitioning | Chia bảng lớn cho insert song song |