รูปแบบคำสั่ง
INSERT INTO yourTableName VALUES (val1, val2, ...), (val1, val2, ...), ...;
สร้างตารางและทดสอบ
mysql> create table DemoTable2007 ( Amount1 int, Amount2 int, Amount3 int );
mysql> insert into DemoTable2007 values
(450,600,700),
(1000,200,3000),
(800,900,1200),
(1300,1500,2000),
(40000,50000,6700);
Query OK, 5 rows affected (0.11 sec) Records: 5 Duplicates: 0 Warnings: 0
ผลลัพธ์
+---------+---------+---------+
| Amount1 | Amount2 | Amount3 |
+---------+---------+---------+
| 450 | 600 | 700 |
| 1000 | 200 | 3000 |
| 800 | 900 | 1200 |
| 1300 | 1500 | 2000 |
| 40000 | 50000 | 6700 |
+---------+---------+---------+
ข้อดีของ Multi-row INSERT
- เร็วกว่ามาก: Round-trip เพียงครั้งเดียว (Network Latency ลดลง)
- Atomic: สำเร็จทั้งหมดหรือล้มเหลวทั้งหมด (ถ้าไม่ได้อยู่ใน Transaction แบบ Manual)
- Log ขนาดเล็กกว่า: Binary Log เขียนครั้งเดียว
- Auto-increment: ให้ค่าต่อเนื่องถูกต้อง
Benchmark (ประมาณ)
| วิธี | 1,000 Rows | 10,000 Rows | 100,000 Rows |
| INSERT แยกแถว (แยก Query) | ~2-5 วิ | ~20-50 วิ | ~200-500 วิ |
| Multi-row INSERT (1 Statement) | ~0.1-0.5 วิ | ~1-3 วิ | ~10-30 วิ |
| LOAD DATA INFILE | ~0.05 วิ | ~0.3 วิ | ~2-5 วิ |
ข้อจำกัด
max_allowed_packet (Default 4MB/64MB) - หากข้อมูลใหญ่เกิน ต้องเพิ่มค่านี้
- ควรแบทช์ (Batch) ประมาณ 100-1000 แถวต่อ Statement
- หากมี Trigger/Constraint ซับซ้อน อาจช้าลง
ตัวอย่างพร้อม Column Names (แนะนำ)
INSERT INTO DemoTable2007 (Amount1, Amount2, Amount3) VALUES
(450, 600, 700),
(1000, 200, 3000),
(800, 900, 1200);
LOAD DATA INFILE (เร็วที่สุดสำหรับ Bulk Load)
LOAD DATA INFILE '/path/to/data.csv'
INTO TABLE DemoTable2007
FIELDS TERMINATED BY ',' ENCLOSED BY '\"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(Amount1, Amount2, Amount3);