BEOBACHTUNG # 1
Das allererste, was mir auffällt, ist die Tischstruktur
CREATE TABLE IF NOT EXISTS `productsCategories` (
`categoriesId` int(11) NOT NULL,
`productsId` int(11) NOT NULL,
PRIMARY KEY (`categoriesId`,`productsId`),
KEY `categoriesId` (`categoriesId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Bitte beachten Sie, dass der categoriesId
Index und der PRIMARY KEY mit derselben Spalte beginnen. Es ist ein redundanter Index. Da es sich bei dieser Tabelle um InnoDB handelt, ist der categoriesId
Index aus einem anderen Grund redundant: Alle Sekundärindizes enthalten Schlüssel für gen_clust_index (auch bekannt als Clustered Index; siehe, wofür wird gen_clust_index in MySQL verwendet? ).
Wenn Sie den categoriesId
Index mit entfernen
ALTER TABLE productsCategories DROP INDEX categoriesId;
Dies wird INSERTs dramatisch verbessern, da keine zusätzliche Wartung des Sekundär- und Clustered-Index durchgeführt werden muss.
BEOBACHTUNG # 2
Wenn Sie Masseneinfügevorgänge ausführen, benötigen Sie einen großen Masseneinfügepuffer .
Bitte beachten Sie meine bisherigen Beiträge dazu:
BEOBACHTUNG # 3
Ihre Protokolldatei ist viel zu klein !!! Es sollte 25% des InnoDB-Pufferpools sein, in Ihrem Fall sollte es 1G sein. In meinem Beitrag erfahren Sie, wie Sie die Größe von InnoDB-Protokolldateien ändern können .
BEOBACHTUNG # 4
Bitte nicht innodb_thread_concurrency setzen !!! Ich habe bei Percona Live NYC aus erster Hand gelernt, diese Einstellung in Ruhe zu lassen . Es ist in MySQL 5.5, MySQL 5.1 InnoDB Plugin und Percona Server 5.1+ standardmäßig deaktiviert.
BEOBACHTUNG # 5
Sie müssen innodb_file_per_table verwenden. Wenn dies deaktiviert ist, mache ich die Dateiverwaltung auf ibdata1 zu einem Albtraum. Bitte lesen Sie meinen Beitrag darüber, wie Sie InnoDB bereinigen können, um dies zu implementieren .
BEOBACHTUNG # 6
Wenn Sie MySQL 5.5 oder Percona Server verwenden, müssen Sie bestimmte Optionen festlegen, damit InnoDB mehrere CPUs / mehrere Kerne verwendet. Bitte lesen Sie meinen Beitrag zu diesen Einstellungen .
BEOBACHTUNG # 7
Du hast innodb_log_buffer_size=4M
. Der Standardwert ist 8M. Dadurch werden die Redo-Protokolle doppelt so häufig gespült. Das wirkt auch Ihrer innodb_flush_log_at_trx_commit=2
Einstellung entgegen . Bitte stellen Sie es auf 32M ein. Weitere Informationen finden Sie in der MySQL-Dokumentation zu innodb_log_buffer_size .
In Anbetracht dieser Beobachtungen fügen Sie bitte die folgenden Einstellungen hinzu oder ersetzen Sie sie:
[mysqld]
innodb_thread_concurrency = 0
innodb_read_io_threads = 64
innodb_write_io_threads = 64
innodb_io_capacity = 5000
innodb_file_per_table
innodb_log_file_size=1G
innodb_log_buffer_size=1G
bulk_insert_buffer_size = 256M