Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Tăng tốc INSERT nhiều hàng trong MySQL với Transaction

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

Lưu ý: Transaction quá lớn (hàng triệu hàng) có thể gây lock lâu, tràn undo log. Nên chia batch 1000-5000 hàng/lần.

Kỹ thuậtMô tả
Multi-row INSERTMột lệnh INSERT nhiều VALUES (như ví dụ)
LOAD DATA INFILENhanh nhất cho file CSV/Text lớn
Tắt index tạm thờiALTER TABLE ... DISABLE KEYS (chỉ MyISAM)
Bulk insert bufferTăng innodb_sort_buffer_size, innodb_log_file_size
PartitioningChia bảng lớn cho insert song song