Ich habe eine Paketprotokolldatenbank, die fast nie abgefragt wird. Es muss nur schnell auf Einsätzen sein. Ich verwende InnoDB, weil ich die ACID-Konformität beibehalten möchte, da selbst der Verlust eines einzelnen Pakets unseren Kunden schaden kann. In einem Leistungsoptimierungsszenario sende ich 1.000.000 Pakete über mehrere DB-Verbindungen an den Server. Unabhängig davon, welche Einstellungen ich in my.cnf verwende, kann der mysqld-Prozess auf einem System mit 12 Kernen nicht mehr als 900% CPU verwenden. (Auf der Box läuft nichts anderes.)
Ich habe folgendes eingestellt
innodb_file_per_table = 1
innodb_write_io_threads = 64
innodb_read_io_threads = 64
innodb_thread_concurrency = 0
Wenn ich MyISAM verwende, kann ich alle Pakete in ca. 6 Sekunden schreiben lassen. InnoDB benötigt jedoch ungefähr 25. Kann ich MySQL dazu bringen, den Rest der Systemressourcen zu nutzen und schneller einzufügen?
Bearbeiten: Hier ist das Schema für die Tabelle:
+-------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------------------+------+-----+---------+-------+
| t | bigint(20) unsigned | YES | | NULL | |
| a | char(1) | YES | | NULL | |
| sa | int(10) unsigned | YES | | NULL | |
| sb | int(10) unsigned | YES | | NULL | |
| sc | int(10) unsigned | YES | | NULL | |
| sd | int(10) unsigned | YES | | NULL | |
| sp | smallint(5) unsigned | YES | | NULL | |
| da | int(10) unsigned | YES | | NULL | |
| db | int(10) unsigned | YES | | NULL | |
| dc | int(10) unsigned | YES | | NULL | |
| dd | int(10) unsigned | YES | | NULL | |
| dp | smallint(5) unsigned | YES | | NULL | |
+-------+----------------------+------+-----+---------+-------+
edit2: Ich habe mehr Einfügungen zusammengestellt, sodass eine einzelne Abfrage nahe der maximalen Länge liegt (ca. 16.000.000 Zeichen). Die Datenbank steigt jetzt für zwei Sekunden auf 1100% und für den Rest der Zeit auf 100%. Die Gesamtzeit beträgt jetzt 21 Sekunden oder ungefähr 16% schneller als zu Beginn.