Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

วิธีทำ Batch Insert (Insert หลายแถวพร้อมกัน) ใน MySQL

Batch Insert (Multi-row Insert) คือการ Insert หลายแถวใน Statement เดียว เร็วกว่า Insert ทีละแถวมาก (ลด Round-trip, Parse, Log Flush)

Syntax

INSERT INTO table_name (col1, col2, col3)
VALUES 
    (val1, val2, val3),
    (val1, val2, val3),
    (val1, val2, val3),
    ...;

ตัวอย่าง

CREATE TABLE MultipleRecordWithValues (
    id INT,
    name VARCHAR(100)
);

-- Batch Insert 4 แถวใน 1 Statement
INSERT INTO MultipleRecordWithValues (id, name) VALUES
    (1, 'John'),
    (2, 'Carol'),
    (3, 'Bob'),
    (4, 'Smith');

-- ผลลัพธ์: Query OK, 4 rows affected (0.16 sec)

ตรวจสอบข้อมูล

SELECT * FROM MultipleRecordWithValues;
+------+-------+
| id   | name  |
+------+-------+
| 1    | John  |
| 2    | Carol |
| 3    | Bob   |
| 4    | Smith |
+------+-------+

Performance Comparison

วิธี1,000 Rows10,000 Rows100,000 Rows
Single INSERT x N~2-5 วินาที~20-50 วินาที~3-5 นาที
Batch INSERT (100 rows/batch)~0.1-0.3 วินาที~1-2 วินาที~10-20 วินาที
LOAD DATA INFILE~0.05 วินาที~0.3 วินาที~2-3 วินาที

Best Practices

  • Batch Size: 100-1000 rows ต่อ Statement (หลีกเลี่ยง Packet Too Large)
  • max_allowed_packet: เพิ่มค่าใน my.cnf หาก Batch ใหญ่ (Default 64MB)
  • Transaction: Wrap หลาย Batch ใน Transaction เดียว (ACID, เร็วขึ้น)
  • Disable Indexes: สำหรับ Bulk Load ใหญ่ๆ ALTER TABLE ... DISABLE KEYS (MyISAM) หรือ Drop/Recreate Index (InnoDB)
  • LOAD DATA INFILE: เร็วที่สุดสำหรับ CSV/TSV File Import

ตัวอย่าง Transaction + Batch

START TRANSACTION;
INSERT INTO users (name, email) VALUES ('A','a@a.com'),('B','b@b.com'),...; -- Batch 1
INSERT INTO users (name, email) VALUES ('X','x@x.com'),('Y','y@y.com'),...; -- Batch 2
COMMIT;

⚠️ ข้อจำกัด

  • Statement ขนาดใหญ่เกิน max_allowed_packet จะ Error
  • Auto-increment Gap ใน Replication (ใช้ innodb_autoinc_lock_mode = 2)
  • Duplicate Key Error จะ Rollback ทั้ง Batch (หากไม่ใช้ IGNORE)