Tôi đang làm việc trên một cơ sở dữ liệu MySQL lớn và tôi cần cải thiện hiệu suất INSERT trên một bảng cụ thể. Cái này chứa khoảng 200 Hàng triệu hàng và cấu trúc của nó như sau:Cách cải thiện hiệu suất INSERT trên bảng MySQL rất lớn
(một tiền đề nhỏ: Tôi không phải là chuyên gia về cơ sở dữ liệu, vì vậy mã tôi viết có thể dựa trên cơ sở sai. Vui lòng giúp tôi hiểu sai lầm :))
CREATE TABLE IF NOT EXISTS items (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(200) NOT NULL,
key VARCHAR(10) NOT NULL,
busy TINYINT(1) NOT NULL DEFAULT 1,
created_at DATETIME NOT NULL,
updated_at DATETIME NOT NULL,
PRIMARY KEY (id, name),
UNIQUE KEY name_key_unique_key (name, key),
INDEX name_index (name)
) ENGINE=MyISAM
PARTITION BY LINEAR KEY(name)
PARTITIONS 25;
mỗi ngày tôi nhận được nhiều file csv trong đó mỗi dòng được sáng tác bởi các cặp "tên; then chốt", vì vậy tôi phải phân tích những tập tin này (thêm giá trị created_at và updated_at cho mỗi hàng) và chèn các giá trị vào bảng của tôi. Trong thế này, sự kết hợp của "tên" và "chìa khóa" phải là duy nhất, vì vậy tôi thực hiện các thủ tục chèn như sau:
CREATE TEMPORARY TABLE temp_items (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(200) NOT NULL,
key VARCHAR(10) NOT NULL,
busy TINYINT(1) NOT NULL DEFAULT 1,
created_at DATETIME NOT NULL,
updated_at DATETIME NOT NULL,
PRIMARY KEY (id)
)
ENGINE=MyISAM;
LOAD DATA LOCAL INFILE 'file_to_process.csv'
INTO TABLE temp_items
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '\"'
(name, key, created_at, updated_at);
INSERT INTO items (name, key, busy, created_at, updated_at)
(
SELECT temp_items.name, temp_items.key, temp_items.busy, temp_items.created_at, temp_items.updated_at
FROM temp_items
)
ON DUPLICATE KEY UPDATE busy=1, updated_at=NOW();
DROP TEMPORARY TABLE temp_items;
Mã chỉ được hiển thị cho phép tôi để đạt được mục tiêu của tôi, nhưng, để hoàn thành việc thực hiện , nó sử dụng khoảng 48 giờ, và đây là một vấn đề. Tôi nghĩ rằng hiệu suất kém này là do thực tế là kịch bản phải kiểm tra trên một bảng rất lớn (200 Hàng triệu) và cho mỗi chèn rằng cặp "tên, khóa" là duy nhất.
Làm cách nào để cải thiện hiệu suất của tập lệnh?
Nhờ tất cả trước.