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 Rows | 10,000 Rows | 100,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)