MySQL Bulk Insert: คู่มือเต็มสำหรับการแทรกข้อมูลประสิทธิภาพสูง

目次

1. บทนำ

ความสำคัญของการแทรกข้อมูลจำนวนมาก

เมื่อทำงานกับ MySQL คุณอาจจำเป็นต้องแทรกรายการข้อมูลจำนวนมากลงในฐานข้อมูลอย่างมีประสิทธิภาพ ตัวอย่างเช่น การจัดเก็บข้อมูลล็อก การย้ายข้อมูล หรือการนำเข้าชุดข้อมูล CSV ขนาดใหญ่แบบจำนวนมาก อย่างไรก็ตาม การแทรกเรคคอร์ดทีละรายการโดยใช้คำสั่ง INSERT มาตรฐานอาจใช้เวลานานและอาจทำให้ประสิทธิภาพลดลงอย่างมีนัยสำคัญ

นี่คือจุดที่ การแทรกข้อมูลจำนวนมาก กลายเป็นประโยชน์ การแทรกข้อมูลจำนวนมากช่วยให้คุณสามารถแทรกแถวข้อมูลหลายแถวในคำค้นหาเดียว ส่งผลให้ประสิทธิภาพของ MySQL ดีขึ้นอย่างมีนัยสำคัญ

วัตถุประสงค์ของบทความนี้

บทความนี้อธิบายการแทรกข้อมูลจำนวนมากใน MySQL อย่างละเอียด—ตั้งแต่การใช้งานพื้นฐานไปจนถึงเทคนิคขั้นสูง ข้อพิจารณาที่สำคัญ และเคล็ดลับการปรับปรุงประสิทธิภาพ มีตัวอย่างที่ชัดเจนรวมอยู่เพื่อให้แน่ใจว่าแม้แต่มือใหม้ก็สามารถเข้าใจและนำไปใช้ได้

2. พื้นฐานของการแทรกข้อมูลจำนวนมาก

การแทรกข้อมูลจำนวนมากคืออะไร?

การแทรกข้อมูลจำนวนมากใน MySQL หมายถึงการแทรกแถวข้อมูลหลายแถวโดยใช้คำค้นหาเดียว วิธีนี้มีประสิทธิภาพมากกว่าการเรียกใช้คำสั่ง INSERT แบบเดี่ยวซ้ำๆ

ตัวอย่างเช่น วิธี INSERT ปกติจะแทรกแถวทีละแถวตามที่แสดงด้านล่าง:

INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com');

การใช้การแทรกข้อมูลจำนวนมาก ข้อมูลเดียวกันสามารถแทรกลงในคำสั่งเดียว:

INSERT INTO users (name, email) VALUES 
('Alice', 'alice@example.com'), 
('Bob', 'bob@example.com');

ข้อดีของการแทรกข้อมูลจำนวนมาก

  1. ประสิทธิภาพที่ดีขึ้น การประมวลผลแถวหลายแถวพร้อมกันจะลดจำนวนการเรียกใช้คำค้นหาและลดการสื่อสารเครือข่ายและ overhead ของดิสก์ I/O
  2. การจัดการธุรกรรมที่ง่ายขึ้น แถวหลายแถวสามารถประมวลผลในธุรกรรมเดียว ทำให้ง่ายต่อการรักษาความสอดคล้องของข้อมูล
  3. โค้ดที่สะอาดกว่า ลดโค้ดที่ซ้ำซาก ทำให้ปรับปรุงการบำรุงรักษา

กรณีการใช้งานทั่วไปสำหรับการแทรกข้อมูลจำนวนมาก

  • การจัดเก็บข้อมูลล็อกจำนวนมากเป็นประจำ
  • การนำเข้าข้อมูลจากระบบภายนอก (เช่น การอ่านไฟล์ CSV)
  • งานย้ายข้อมูลและการกู้คืนสำรอง

3. วิธีการแทรกข้อมูลจำนวนมากใน MySQL

การใช้คำสั่ง INSERT แบบหลายแถว

MySQL อนุญาตให้แทรกแบบกลุ่มโดยใช้ไวยากรณ์ INSERT แบบหลายแถว วิธีนี้เรียบง่ายและเหมาะสำหรับสถานการณ์หลายอย่าง

ไวยากรณ์พื้นฐาน

ด้านล่างนี้คือไวยากรณ์พื้นฐานสำหรับการแทรกหลายแถวพร้อมกัน:

INSERT INTO table_name (column1, column2, ...) VALUES 
(value1, value2, ...), 
(value3, value4, ...), 
...;

ตัวอย่าง

ตัวอย่างด้านล่างแทรกสามแถวลงในตาราง users:

INSERT INTO users (name, email) VALUES 
('Alice', 'alice@example.com'), 
('Bob', 'bob@example.com'), 
('Charlie', 'charlie@example.com');

ข้อดีและข้อเสีย

  • ข้อดี
  • ง่ายต่อการนำไปใช้และเข้าใจสำหรับผู้ที่คุ้นเคยกับ SQL
  • สามารถรักษาความสอดคล้องของข้อมูลโดยใช้ธุรกรรม
  • ข้อเสีย
  • หากปริมาณข้อมูลมากเกินไป คำค้นหาอาจเกินขีดจำกัดขนาด (ค่าเริ่มต้นคือ 1MB)

การใช้คำสั่ง LOAD DATA INFILE

LOAD DATA INFILE แทรกข้อมูลจำนวนมากจากไฟล์ข้อความ (เช่น รูปแบบ CSV) อย่างมีประสิทธิภาพ โดยเฉพาะอย่างยิ่งมีประสิทธิภาพในสภาพแวดล้อมเซิร์ฟเวอร์ MySQL ที่รองรับการโหลดไฟล์

ไวยากรณ์พื้นฐาน

ด้านล่างนี้คือไวยากรณ์พื้นฐานสำหรับ LOAD DATA INFILE:

LOAD DATA INFILE 'file_path' 
INTO TABLE table_name 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\n';

ตัวอย่าง

ตัวอย่างด้านล่างแทรกรายการจากไฟล์ users.csv ลงในตาราง users

  1. เนื้อหาไฟล์ CSV
    Alice,alice@example.com
    Bob,bob@example.com
    Charlie,charlie@example.com
    
  1. การเรียกใช้คำสั่ง
    LOAD DATA INFILE '/path/to/users.csv' 
    INTO TABLE users 
    FIELDS TERMINATED BY ',' 
    ENCLOSED BY '"' 
    LINES TERMINATED BY '\n';
    

ข้อดีและข้อเสีย

  • ข้อดี
  • เร็วและมีประสิทธิภาพสูงสำหรับชุดข้อมูลขนาดใหญ่
  • ใช้การดำเนินการไฟล์แบบเนทีฟ ทำให้เหมาะสำหรับการนำเข้าข้อมูลขนาดใหญ่
  • ข้อเสีย
  • ขึ้นอยู่กับเส้นทางไฟล์และการตั้งค่าสิทธิ์
  • เซิร์ฟเวอร์บางตัวปิดการใช้งาน LOAD DATA INFILE เพื่อความปลอดภัย

การใช้ยูทิลิตี้ mysqlimport

mysqlimport เป็นเครื่องมือบรรทัดคำสั่งที่รวมอยู่ใน MySQL ซึ่งนำเข้าข้อมูลจำนวนมากจากไฟล์ มันทำหน้าที่เป็น wrapper สำหรับ LOAD DATA INFILE.

ไวยากรณ์พื้นฐาน

mysqlimport --local database_name file_name

ตัวอย่าง

ตัวอย่างต่อไปนี้นำเข้า users.csv ไปยังตาราง users:

mysqlimport --local --fields-terminated-by=',' --lines-terminated-by='\n' my_database /path/to/users.csv

ข้อดีและข้อเสีย

  • ข้อดี
  • ง่ายต่อการเรียกใช้จากบรรทัดคำสั่ง
  • เร็ว คล้ายกับ LOAD DATA INFILE
  • ข้อเสีย
  • อาจเกิดข้อผิดพลาดหากรูปแบบไฟล์ไม่ถูกต้อง
  • อาจใช้เวลาทำความคุ้นเคยเมื่อเทียบกับการเขียน SQL โดยตรง

4. สิ่งที่ควรพิจารณาและข้อจำกัดของการแทรกแบบ Bulk

ขีดจำกัดขนาดของ Query

ใน MySQL ปริมาณข้อมูลที่สามารถส่งในหนึ่ง query มีขีดจำกัด ขีดจำกัดนี้ถูกควบคุมโดยการตั้งค่า max_allowed_packet ค่าเริ่มต้นคือ 1MB แต่หากคุณแทรกข้อมูลจำนวนมาก คุณอาจต้องเพิ่มค่านี้

วิธีแก้ไข

  • เพิ่ม max_allowed_packet ในการตั้งค่าเซิร์ฟเวอร์:
    SET GLOBAL max_allowed_packet = 16M;
    
  • แบ่งการแทรกเป็นชุดย่อย ๆ (เช่น ประมวลผล 1,000 แถวต่อชุด)

ผลกระทบของ Indexes

เมื่อทำการแทรกแบบ bulk บนตารางที่มีหลาย index, MySQL อาจอัปเดต index สำหรับแต่ละแถวที่แทรก ซึ่งอาจทำให้กระบวนการช้าลง

วิธีแก้ไข

  • ปิดการใช้งาน indexes ชั่วคราวก่อนทำการแทรก : หากคุณแทรกข้อมูลจำนวนมาก การลบ indexes ชั่วคราวและสร้างใหม่หลังจากการแทรกเสร็จอาจมีประสิทธิภาพ
    ALTER TABLE table_name DISABLE KEYS;
    -- Bulk insert operations
    ALTER TABLE table_name ENABLE KEYS;
    
  • เพิ่ม indexes หลังจากแทรกข้อมูล : การสร้าง indexes ใหม่หลังจากการแทรกทำให้สามารถสร้าง indexes เป็นกลุ่มได้ ซึ่งมักจะเพิ่มความเร็ว

การจัดการ Transaction

เมื่อแทรกข้อมูลจำนวนมาก อาจเกิดข้อผิดพลาดและบางแถวอาจไม่สามารถแทรกได้ การใช้ transaction ช่วยรักษาความสอดคล้องในสถานการณ์เหล่านี้

วิธีแก้ไข

ใช้ transaction เพื่อให้การแทรกถูก commit เฉพาะเมื่อข้อมูลทั้งหมดถูกแทรกสำเร็จ

START TRANSACTION;
INSERT INTO table_name ...;
-- Execute all required insert operations
COMMIT;

หากเกิดข้อผิดพลาด ให้ทำ rollback เพื่อหลีกเลี่ยงการแทรกบางส่วน

ROLLBACK;

ความปลอดภัยและสิทธิ์

เมื่อใช้ LOAD DATA INFILE หรือ mysqlimport คุณต้องมีสิทธิ์อ่านไฟล์ อย่างไรก็ตาม สภาพแวดล้อมเซิร์ฟเวอร์บางแห่งจำกัดการดำเนินการเหล่านี้เพื่อความปลอดภัย

วิธีแก้ไข

  • หากเซิร์ฟเวอร์ไม่อนุญาต LOAD DATA INFILE ให้ใช้ LOAD DATA LOCAL INFILE ฝั่งไคลเอนต์
  • ยืนยันสิทธิ์ที่จำเป็นและขอให้ผู้ดูแลระบบตั้งค่าที่เหมาะสม

หมายเหตุอื่น ๆ

  • ความสอดคล้องของชุดอักขระ : หากชุดอักขระของไฟล์ข้อมูลไม่ตรงกับการตั้งค่าตาราง คุณอาจเห็นอักขระผิดรูปหรือข้อผิดพลาด ตรวจสอบการเข้ารหัสก่อนทำการแทรก
  • ความเสี่ยงของ deadlock : หากหลายกระบวนการแทรกข้อมูลพร้อมกัน อาจเกิด deadlock การทำให้การแทรกเป็นลำดับสามารถช่วยหลีกเลี่ยงได้

5. แนวทางปฏิบัติที่ดีที่สุดสำหรับ Bulk Insert

ใช้ Transactions

ตามที่กล่าวข้างต้น Transactions ช่วยรักษาความสอดคล้องของข้อมูล ซึ่งมีประโยชน์อย่างยิ่งเมื่อแทรกข้อมูลข้ามหลายตาราง

START TRANSACTION;
-- Execute bulk insert
COMMIT;

ปรับแต่งการทำงานของ Index

การปิดการใช้งาน indexes ก่อนทำการแทรกและสร้างใหม่หลังจากนั้นสามารถเพิ่มความเร็วในการแทรกได้อย่างมาก

ALTER TABLE table_name DISABLE KEYS;
-- Execute bulk insert
ALTER TABLE table_name ENABLE KEYS;

เลือกขนาด Batch ที่เหมาะสม

เมื่อแทรกข้อมูลจำนวนมาก การเลือกขนาด batch ที่เหมาะสม (จำนวนแถวต่อคำสั่ง query) จะช่วยเพิ่มประสิทธิภาพสูงสุด โดยทั่วไป 1,000 ถึง 10,000 แถวต่อ batch มักถือว่าเหมาะสม

ตัวอย่างปฏิบัติ

การแบ่ง batch การแทรกทุก 1,000 แถว มักมีประสิทธิภาพ:

INSERT INTO users (name, email) VALUES
('Alice', 'alice@example.com'),
('Bob', 'bob@example.com'),
... -- about 1000 rows
;

ตรวจสอบข้อมูลก่อนแทรก

การตรวจสอบว่ารูปแบบข้อมูลและค่าถูกต้องก่อนแทรกช่วยป้องกันข้อผิดพลาด

# Example: Data validation using Python
import csv

with open('users.csv', mode='r') as file:
    reader = csv.reader(file)
    for row in reader:
        # Check whether the format is valid
        if '@' not in row[1]:
            print(f"Invalid email format: {row[1]}")

จัดการข้อผิดพลาด

เพื่อเตรียมพร้อมสำหรับความล้มเหลว ให้ส่งออก log ข้อผิดพลาดเพื่อให้การดีบักง่ายขึ้น

LOAD DATA INFILE '/path/to/users.csv'
INTO TABLE users
LOG ERRORS INTO 'error_log';

6. การปรับแต่งประสิทธิภาพการแทรกแบบกลุ่ม

ปรับขนาด Batch ให้เหมาะสม

จำนวนแถวที่แทรกต่อ query (ขนาด batch) มีผลกระทบใหญ่ต่อประสิทธิภาพ การเลือกขนาดที่เหมาะสมจะลดการสื่อสารเครือข่ายและ overhead ของ disk I/O ทำให้การแทรกมีประสิทธิภาพมากขึ้น

แนวปฏิบัติที่ดี

  • ขนาดที่แนะนำ : โดยทั่วไป 1,000 ถึง 10,000 แถวต่อ batch
  • หากขนาด batch เล็กเกินไป จำนวน query จะเพิ่มขึ้น ทำให้ overhead ของเครือข่ายและ disk เพิ่มขึ้น
  • หากขนาด batch ใหญ่เกินไป อาจชนกับขีดจำกัด max_allowed_packet หรือเพิ่มการใช้งานหน่วยความจำ

ตัวอย่าง

แบ่งข้อมูลและแทรกในหลายรอบตามที่แสดงด้านล่าง:

INSERT INTO users (name, email) VALUES 
('Alice', 'alice@example.com'),
('Bob', 'bob@example.com'),
... -- up to 1000 rows
;

ปิดใช้งานดัชนีชั่วคราว

การอัปเดตดัชนีระหว่างการแทรกแบบกลุ่มทำให้ต้องคำนวณดัชนีใหม่ในแต่ละการแทรก ซึ่งอาจทำให้การประมวลผลช้าลง

วิธีแก้ไข

  • ปิดใช้งานดัชนีก่อนแทรกและสร้างใหม่หลังจากเสร็จสิ้นการแทรก
    ALTER TABLE table_name DISABLE KEYS;
    -- Execute bulk insert
    ALTER TABLE table_name ENABLE KEYS;
    

ใช้ล็อกตาราง

การล็อกตารางชั่วคราวระหว่างการแทรกแบบกลุ่มสามารถป้องกันการแข่งขันกับ query อื่นๆ และปรับปรุงความเร็ว

ตัวอย่าง

LOCK TABLES table_name WRITE;
-- Execute bulk insert
UNLOCK TABLES;

ปรับปรุง LOAD DATA INFILE

LOAD DATA INFILE เป็นหนึ่งในวิธีการแทรกแบบกลุ่มที่เร็วที่สุด และคุณสามารถปรับปรุงประสิทธิภาพเพิ่มเติมโดยใช้ตัวเลือกด้านล่าง

ตัวอย่างตัวเลือก

  • IGNORE : ละเว้นแถวที่ซ้ำและแทรกที่เหลือ
    LOAD DATA INFILE '/path/to/file.csv' 
    INTO TABLE users 
    IGNORE;
    
  • CONCURRENT : ลดผลกระทบแม้เมื่อตารางถูกใช้งานโดย query อื่นๆ
    LOAD DATA CONCURRENT INFILE '/path/to/file.csv' 
    INTO TABLE users;
    

ปรับการตั้งค่า MySQL

  1. innodb_buffer_pool_size หากคุณใช้ตาราง InnoDB การเพิ่มพารามิเตอร์นี้สามารถปรับปรุงประสิทธิภาพการอ่าน/เขียน
    SET GLOBAL innodb_buffer_pool_size = 1G;
    
  1. bulk_insert_buffer_size หากคุณใช้ตาราง MyISAM การตั้งค่าพารามิเตอร์นี้สามารถปรับปรุงประสิทธิภาพการแทรกแบบกลุ่ม
    SET GLOBAL bulk_insert_buffer_size = 256M;
    
  1. ปิดใช้งาน autocommit ชั่วคราว ปิดใช้งาน autocommit ระหว่างการแทรก จากนั้นเปิดใช้งานอีกครั้ง
    SET autocommit = 0;
    -- Execute bulk insert
    COMMIT;
    SET autocommit = 1;
    

การเปรียบเทียบประสิทธิภาพก่อน/หลัง

คุณสามารถวัดประสิทธิภาพก่อนและหลังการปรับแต่งโดยใช้สคริปต์เช่นด้านล่าง:

-- Record a timestamp before inserting
SET @start_time = NOW();

-- Execute bulk insert
INSERT INTO users (name, email) VALUES 
('Alice', 'alice@example.com'),
('Bob', 'bob@example.com'),
... -- about 1000 rows

-- Measure execution time
SELECT TIMESTAMPDIFF(SECOND, @start_time, NOW()) AS execution_time;

This allows you to confirm tuning effects with concrete numbers.

7. ตัวอย่างการใช้งานจริงของ Bulk Insert

ตัวอย่าง: แทรกข้อมูลผู้ใช้จากไฟล์ CSV

1. เตรียมข้อมูล

ก่อนอื่นให้เตรียมข้อมูลที่จะทำการแทรกในรูปแบบ CSV ในตัวอย่างนี้ เราใช้ไฟล์ users.csv ที่มีข้อมูลผู้ใช้ (ชื่อและที่อยู่อีเมล)

Alice,alice@example.com
Bob,bob@example.com
Charlie,charlie@example.com

2. สร้างตาราง

สร้างตารางเพื่อแทรกข้อมูลเข้าไป

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE
);

3. Bulk Insert: Multi-Row INSERT

สำหรับชุดข้อมูลขนาดเล็ก คุณสามารถแทรกข้อมูลโดยใช้คำสั่ง INSERT แบบหลายแถวตามที่แสดงด้านล่าง

INSERT INTO users (name, email) VALUES
('Alice', 'alice@example.com'),
('Bob', 'bob@example.com'),
('Charlie', 'charlie@example.com');

4. Bulk Insert: LOAD DATA INFILE

สำหรับชุดข้อมูลขนาดใหญ่ การใช้ LOAD DATA INFILE เป็นวิธีที่มีประสิทธิภาพ

ตัวอย่างคำสั่ง
LOAD DATA INFILE '/path/to/users.csv'
INTO TABLE users
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n'
(name, email);

5. วัดประสิทธิภาพ

เพื่อยืนยันประสิทธิภาพการแทรก ให้รันการทดสอบประสิทธิภาพอย่างง่าย

ตัวอย่างสคริปต์
SET @start_time = NOW();

LOAD DATA INFILE '/path/to/users.csv'
INTO TABLE users
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n'
(name, email);

SELECT TIMESTAMPDIFF(SECOND, @start_time, NOW()) AS execution_time;

สคริปต์นี้จะแสดงเวลาที่ใช้ในการแทรกข้อมูลเป็นวินาที

8. คำถามที่พบบ่อย

Q1: ฉันได้รับข้อผิดพลาดว่า “Duplicate entry” ระหว่างการ bulk insert ควรจัดการอย่างไร?

A1:
ข้อผิดพลาดการทำซ้ำเกิดขึ้นเมื่อข้อมูลบางส่วนที่จะแทรกขัดแย้งกับข้อมูลที่มีอยู่ คุณสามารถจัดการได้โดยใช้วิธีต่อไปนี้

  1. ใช้ตัวเลือก IGNORE เพิกเฉยต่อข้อผิดพลาดการทำซ้ำและแทรกแถวที่เหลือ
    INSERT IGNORE INTO users (name, email) VALUES 
    ('Alice', 'alice@example.com'), 
    ('Bob', 'bob@example.com');
    
  1. ใช้ ON DUPLICATE KEY UPDATE ปรับปรุงแถวที่มีอยู่เมื่อเกิดการทำซ้ำ
    INSERT INTO users (name, email) VALUES 
    ('Alice', 'alice@example.com') 
    ON DUPLICATE KEY UPDATE email = VALUES(email);
    

Q2: ฉันได้รับข้อผิดพลาด “Permission denied” เมื่อใช้ LOAD DATA INFILE ควรทำอย่างไร?

A2:
ข้อผิดพลาดนี้เกิดขึ้นเมื่อเซิร์ฟเวอร์ MySQL ไม่อนุญาตให้ใช้คำสั่ง LOAD DATA INFILE คุณสามารถแก้ไขได้โดยใช้วิธีต่อไปนี้

  1. ใช้ LOAD DATA LOCAL INFILE หากอ่านไฟล์จากเครื่องลูกค้า ให้ใช้ตัวเลือก LOCAL
    LOAD DATA LOCAL INFILE '/path/to/users.csv' 
    INTO TABLE users 
    FIELDS TERMINATED BY ',' 
    LINES TERMINATED BY '\n';
    
  1. ตรวจสอบการตั้งค่า MySQL ยืนยันว่า local_infile ถูกเปิดใช้งานบนเซิร์ฟเวอร์
    SHOW VARIABLES LIKE 'local_infile';
    SET GLOBAL local_infile = 1;
    

Q3: ประสิทธิภาพการ bulk insert ไม่เพิ่มขึ้นตามที่คาดหวัง ควรตรวจสอบอะไรบ้าง?

A3:
ตรวจสอบประเด็นต่อไปนี้และปรับแต่งการตั้งค่าให้เหมาะสม

  1. ลดจำนวนดัชนี การปิดใช้งานดัชนีชั่วคราวระหว่าง bulk insert สามารถเพิ่มความเร็วได้ (ดู “Impact of Indexes” ข้างต้น)

  2. ปรับขนาด batch เลือกขนาด batch ที่เหมาะสม (โดยทั่วไป 1,000 ถึง 10,000 แถว) ตามปริมาณข้อมูล

  3. ปรับการตั้งค่า MySQL

  • เพิ่ม innodb_buffer_pool_size (สำหรับ InnoDB).
  • ปรับ bulk_insert_buffer_size (สำหรับ MyISAM).
  1. ใช้การล็อกตาราง ล็อกตารางชั่วคราวเพื่อหลีกเลี่ยงการขัดแย้งกับคิวรีอื่น
    LOCK TABLES users WRITE;
    -- Execute bulk insert
    UNLOCK TABLES;
    

Q4: เกิดข้อผิดพลาดเนื่องจากรูปแบบ CSV ไม่ถูกต้อง รูปแบบที่ถูกต้องคืออะไร?

A4:
ยืนยันว่า CSV ตรงตามข้อกำหนดต่อไปนี้

  1. แยกแต่ละฟิลด์ด้วยเครื่องหมายคอมม่า ( , )
    Alice,alice@example.com
    Bob,bob@example.com
    
  1. หากข้อมูลมีอักขระพิเศษ ให้ทำการ escape อย่างถูกต้อง
    "Alice O'Conner","alice.o@example.com"
    
  1. ตรวจสอบให้แน่ใจว่าบรรทัดสุดท้ายลงท้ายด้วยอักขระ newline
  • หากบรรทัดสุดท้ายไม่ได้ลงท้ายด้วย newline อาจถูกละเลยได้

Q5: ฉันจะรักษาความสมบูรณ์ของข้อมูลได้อย่างไร?

A5:
คุณสามารถรักษาความสมบูรณ์ของข้อมูลได้โดยใช้วิธีต่อไปนี้:

  1. ใช้การทำธุรกรรม ทำการคอมมิตเฉพาะเมื่อข้อมูลทั้งหมดถูกแทรกสำเร็จเพื่อรักษาความสอดคล้อง
    START TRANSACTION;
    -- Execute bulk insert
    COMMIT;
    
  1. ตรวจสอบความถูกต้องของข้อมูลเข้า ก่อนทำการแทรก ให้ใช้สคริปต์หรือเครื่องมือเพื่อตรวจสอบรูปแบบข้อมูลและข้อมูลซ้ำ
  2. ใช้บันทึกข้อผิดพลาด บันทึกแถวที่ไม่ถูกต้อง แก้ไขภายหลัง แล้วแทรกใหม่
    LOAD DATA INFILE '/path/to/users.csv'
    INTO TABLE users
    LOG ERRORS INTO 'error_log';
    

9. สรุป

ความสำคัญของ Bulk Insert

Bulk insert ใน MySQL เป็นเทคนิคที่มีประสิทธิภาพสำหรับการแทรกข้อมูลจำนวนมากอย่างมีประสิทธิภาพ เมื่อเทียบกับการใช้คำสั่ง INSERT มาตรฐานซ้ำ ๆ การทำ bulk insert จะลดจำนวนการดำเนินการคิวรีและสามารถปรับปรุงประสิทธิภาพได้อย่างมาก.

บทความนี้ครอบคลุมประเด็นสำคัญต่อไปนี้อย่างละเอียด:

  1. พื้นฐานของ Bulk Insert
  • แนวคิดหลักและกรณีการใช้งานทั่วไป.
  1. วิธีการดำเนินการเชิงปฏิบัติ
  • การแทรกข้อมูลโดยใช้ multi-row INSERT, LOAD DATA INFILE และ mysqlimport .
  1. ข้อพิจารณาและข้อจำกัด
  • ข้อจำกัดขนาดของคิวรี, ผลกระทบของดัชนี, และปัญหาการอนุญาต/ความปลอดภัย พร้อมแนวทางแก้ไข.
  1. การปรับจูนประสิทธิภาพ
  • การปรับขนาดแบตช์ให้เหมาะสม, การใช้การล็อกตาราง, และการปรับแต่งการตั้งค่า MySQL.
  1. ตัวอย่างเชิงปฏิบัติ
  • ขั้นตอนที่เป็นรูปธรรมพร้อมข้อมูลตัวอย่างและการวัดประสิทธิภาพ.
  1. คำถามที่พบบ่อย
  • ปัญหาการดำเนินงานทั่วไปและแนวทางแก้ไข.

ลองทำในสภาพแวดล้อมของคุณ

โดยใช้วิธีที่แนะนำในบทความนี้ คุณสามารถเริ่มทดลอง bulk insert ได้ทันที ลองทำตามขั้นตอนต่อไปนี้:

  1. เตรียมชุดข้อมูลขนาดเล็กและทดสอบด้วย multi-row INSERT.
  2. สำหรับชุดข้อมูลขนาดใหญ่ ให้ลองใช้ LOAD DATA INFILE และวัดประสิทธิภาพ.
  3. ตามความจำเป็น เพิ่มการทำธุรกรรมและการจัดการข้อผิดพลาด แล้วนำวิธีนี้ไปใช้ในสภาพแวดล้อมการผลิต.

การเรียนรู้เพิ่มเติม

สำหรับการใช้งานขั้นสูงและรายละเอียดเพิ่มเติม โปรดอ้างอิงแหล่งข้อมูลต่อไปนี้:

หมายเหตุสุดท้าย

Bulk insert ของ MySQL สามารถปรับปรุงประสิทธิภาพของฐานข้อมูลได้อย่างมากเมื่อใช้อย่างเหมาะสม ใช้สิ่งที่คุณได้เรียนรู้จากที่นี่เพื่อเพิ่มประสิทธิภาพในระบบของคุณและบรรลุการจัดการข้อมูลที่ดียิ่งขึ้น.