Как улучшить производительность INSERT для очень большой таблицы MySQL
Я работаю с большой базой данных MySQL, и мне нужно улучшить производительность INSERT для конкретной таблицы. Этот содержит около 200 миллионов строк и имеет следующую структуру:
(небольшая предпосылка: я не эксперт по базам данных, поэтому коднаписанное может быть основано на неправильных основаниях. Пожалуйста, помогите мне понять мои ошибки :))
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;
Каждый день я получаю много CSV-файлов, в которых каждая строка состоит из пары "имя, ключ»поэтому я должен проанализировать эти файлы (добавив значения create_at и updated_at для каждой строки) и вставить значения в мою таблицу. В этом, сочетание "название" а также "ключ» ДОЛЖЕН быть УНИКАЛЬНЫМ, поэтому я реализовал процедуру вставки следующим образом:
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;
Только что показанный код позволяет мне достичь своей цели, но, чтобы завершить выполнение, он занимает около 48 часов, и это проблема. Я думаю, что эта низкая производительность вызвана тем, что скрипт должен проверять очень большую таблицу (200 миллионов строк) и для каждой вставки, что пара "имя, ключ» уникален
Как я могу улучшить производительность моего скрипта?
Спасибо всем заранее.