Я работаю над большой базой данных 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, в которых каждая строка состоит из пары «имя; ключ», поэтому мне приходится анализировать эти файлы (добавляя значения created_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 миллионов строк) и для каждой вставки, что пара "имя; ключ" уникальна.
Как я могу улучшить производительность моего скрипта?
Спасибо всем заранее.