หลักการ: Multi-row INSERT
ใช้คำสั่ง INSERT เพียงครั้งเดียว แต่ระบุหลายชุดค่า:
INSERT INTO yourTableName VALUES
(NULL, 'value1', 'value2'),
(NULL, 'value1', 'value2'),
... N rows;
ตัวอย่างการทดสอบ
mysql> CREATE TABLE DemoTable1839 (
ClientId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
ClientName VARCHAR(20),
ClientAge INT
);
mysql> INSERT INTO DemoTable1839 VALUES
(NULL,'Chris',29),(NULL,'Chris',29),(NULL,'Chris',29),(NULL,'Chris',29),
(NULL,'Chris',29),(NULL,'Chris',29),(NULL,'Chris',29),(NULL,'Chris',29);
Query OK, 8 rows affected (0.00 sec)
ผลลัพธ์
+----------+------------+-----------+
| ClientId | ClientName | ClientAge |
+----------+------------+-----------+
| 1 | Chris | 29 |
| 2 | Chris | 29 |
| 3 | Chris | 29 |
| 4 | Chris | 29 |
| 5 | Chris | 29 |
| 6 | Chris | 29 |
| 7 | Chris | 29 |
| 8 | Chris | 29 |
+----------+-----------+
เหตุผลที่เร็วกว่า
- ลด Network Round-trip (ส่งคำสั่งครั้งเดียว)
- ลด Parsing และ Optimization Overhead
- Transaction เดียว = เขียน Disk ครั้งเดียว (Durability)
- InnoDB: ลดการ Flush Log ต่อ Transaction
เทคนิคเพิ่มเติมสำหรับ Bulk Insert
-- 1. ปิด Index ชั่วคราว (MyISAM)
ALTER TABLE table DISABLE KEYS;
-- INSERT ...
ALTER TABLE table ENABLE KEYS;
-- 2. ใช้ LOAD DATA INFILE (เร็วที่สุดสำหรับไฟล์)
LOAD DATA INFILE 'data.csv' INTO TABLE table FIELDS TERMINATED BY ',';
-- 3. เพิ่ม innodb_buffer_pool_size ให้ใหญ่พอ
ข้อจำกัด
- ขนาด Packet:
max_allowed_packet(ค่าเริ่มต้น 4MB-64MB) - ควรแบทช์ ~1000-5000 แถวต่อคำสั่ง
- หน่วยความจำ Client/Server