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

MySQL: INSERT หลายแถวพร้อมกันอย่างรวดเร็วด้วย Single Statement

รูปแบบคำสั่ง

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 Rows10,000 Rows100,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);