MySQL รองรับการ INSERT หลายแถวในคำสั่งเดียว (Multi-row INSERT) โดยใช้ Syntax VALUES (...), (...), ... ซึ่งเร็วกว่า INSERT แยกหลายคำสั่งมาก
Syntax
INSERT INTO table_name (col1, col2, ...) VALUES (val1, val2, ...), (val1, val2, ...), ...;
สร้างตารางและ INSERT 4 แถวทีเดียว
mysql> create table DemoTable (
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Value1 int, Value2 int, Value3 int
);
mysql> insert into DemoTable(Value1,Value2,Value3) values(10,20,40),(100,148,120),(150,670,1000),(100000,200000,409999);
ผลลัพธ์
+----+--------+--------+--------+ | Id | Value1 | Value2 | Value3 | +----+--------+--------+--------+ | 1 | 10 | 20 | 40 | | 2 | 100 | 148 | 120 | | 3 | 150 | 670 | 1000 | | 4 | 100000 | 200000 | 409999 | +----+--------+--------+--------+
ประโยชน์ของ Multi-row INSERT
- เร็วกว่า 10-100 เท่า ของ INSERT แยกคำสั่ง (Single Round-trip)
- Atomic - ทำสำเร็จทั้งหมดหรือ Rollback ทั้งหมด
- ลด Network Round-trips - สำคัญเมื่อ Latency สูง
- Binary Log ขนาดเล็กลง - Replication เร็วขึ้น
ข้อจำกัด
max_allowed_packet- ขนาด Packet สูงสุด (Default 4MB/64MB) หากเกินจะ Error- จำนวนแถวเยอะมาก (>1000) ควรแบทช์ (Batch) ทีละ 500-1000 แถว
ON DUPLICATE KEY UPDATEใช้ได้กับ Multi-row INSERT
ตัวอย่างพร้อม ON DUPLICATE KEY UPDATE
INSERT INTO users (id, name, email, login_count)
VALUES (1, 'John', 'john@example.com', 1),
(2, 'Jane', 'jane@example.com', 1)
ON DUPLICATE KEY UPDATE
login_count = login_count + 1,
name = VALUES(name);
เปรียบเทียบประสิทธิภาพ
| วิธี | 1000 แถว | 10000 แถว | หมายเหตุ |
|---|---|---|---|
| INSERT แยก (Loop) | ~2-5 วินาที | ~20-50 วินาที | Round-trip ทุกแถว |
| Multi-row INSERT | ~0.05-0.1 วินาที | ~0.5-1 วินาที | Single Round-trip |
| LOAD DATA INFILE | ~0.01-0.03 วินาที | ~0.1-0.3 วินาที | เร็วที่สุด สำหรับไฟล์ |