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

วิธีเร็วที่สุดในการ Insert ข้อมูลจำนวนมากใน MySQL

หลักการ: 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