Ich arbeite mit einem riesigen Tisch, der 250 Millionen Zeilen hat. Das Schema ist einfach.MySQL Insert-Leistung verschlechtert sich auf einem großen Tisch
CREATE TABLE MyTable (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
oid INT NOT NULL,
long1 BIGINT NOT NULL,
str1 VARCHAR(30) DEFAULT NULL,
str2 VARCHAR(30) DEFAULT NULL,
str2 VARCHAR(200) DEFAULT NULL,
str4 VARCHAR(50) DEFAULT NULL,
int1 INT(6) DEFAULT NULL,
str5 VARCHAR(300) DEFAULT NULL,
date1 DATE DEFAULT NULL,
date2 DATE DEFAULT NULL,
lastUpdated TIMESTAMP NOT NULL,
hashcode INT NOT NULL,
active TINYINT(1) DEFAULT 1,
KEY oid(oid),
KEY lastUpdated(lastUpdated),
UNIQUE KEY (hashcode, active),
KEY (active)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 MAX_ROWS=1000000000;
Die Leistung des Einsatzes ist deutlich gesunken. Bis zu 150 Millionen Zeilen in der Tabelle dauerte es 5-6 Sekunden, um 10.000 Zeilen einzufügen. Jetzt ist es 2-4 Mal höher gegangen. Die ibdata-Datei von Innodb ist auf 107 GB angewachsen. Innodb-Konfigurationsparameter sind wie folgt.
innodb_buffer_pool_size = 36G # Machine has 48G memory
innodb_additional_mem_pool_size = 20M
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_file_size = 50M
innodb_log_buffer_size = 20M
innodb_log_files_in_group=2
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
innodb_thread_concurrency = 8
innodb_flush_method = O_DIRECT
expire_logs_days = 4
IO Wartezeit ist gestiegen, wie mit top
gesehen. Ich habe versucht, die Flush-Methode zu O_DSYNC zu ändern, aber es hat nicht geholfen. Die Festplatte ist aus Hardware-RAID-10-Setup geschnitzt. In einem früheren Setup mit einer einzelnen Festplatte war IO kein Problem.
Wird die Option "Nur Tabelle" partitioniert? Kann das Teilen einzelner 100G-Dateien in "kleinere" Dateien helfen? Gibt es Variablen, die auf RAID abgestimmt werden müssen?
Update: Dies ist ein Testsystem. Ich habe die Freiheit, Änderungen vorzunehmen.
Danke, Mark. Dies ist ein Testsystem. –
Ihr Tipp zur Indexgröße ist hilfreich. Ich arbeite an der Indexierung. –