Pracuję nad dużą bazą danych MySQL i muszę poprawić wydajność INSERT w konkretnej tabeli. Ten zawiera około 200 milionów wierszy, a jego struktura jest następująca:Jak poprawić wydajność INSERT na bardzo dużej tabeli MySQL
(małe założenie: nie jestem ekspertem od bazy danych, więc napisany przeze mnie kod mógłby opierać się na niewłaściwych fundamentach.) Proszę, pomóż mi zrozumieć błędy :))
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;
codziennie otrzymuję wiele plików csv, w którym każda linia składa się z pary „nazwa; klucz”, więc mam do analizowania tych plików (dodawanie wartości created_at i updated_at dla każdego wiersza) i wstaw wartości do mojej tabeli. W tym jednym, kombinacja „nazwa” i „klucz” musi być niepowtarzalny, tak I wdrożone procedury wstawiania następująco:
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;
Kod właśnie pokazano pozwala mi osiągnąć mój cel, ale do zakończenia realizacji , zatrudnia około 48 godzin, a to jest problem. Myślę, że ta słaba wydajność wynika z faktu, że skrypt musi sprawdzić na bardzo dużej tabeli (200 milionów wierszy) i dla każdego wstawienia, że para "nazwa, klucz" jest unikalna.
Jak mogę poprawić wydajność mojego skryptu?
Dziękuję wszystkim z góry.