Ho un database di log di pacchetti, che non viene quasi mai interrogato. Deve solo essere veloce sugli inserti. Sto usando InnoDB perché mi piacerebbe mantenere la conformità ACID, poiché anche perdere un singolo pacchetto potrebbe essere dannoso per i nostri clienti. In uno scenario di ottimizzazione delle prestazioni, invio 1.000.000 di pacchetti al server su più connessioni DB. Ma indipendentemente dalle impostazioni che utilizzo in my.cnf, non riesco a far sì che il processo mysqld usi più del 900% di CPU su un sistema con 12 core. (Nient'altro è in esecuzione sulla scatola.)
Ho impostato quanto segue
innodb_file_per_table = 1
innodb_write_io_threads = 64
innodb_read_io_threads = 64
innodb_thread_concurrency = 0
Se uso MyISAM, posso ottenere tutti i pacchetti scritti in circa 6 secondi. Ma InnoDB impiega circa 25. Posso fare in modo che MySQL usi il resto delle risorse di sistema e inserisca più velocemente?
Modifica: ecco lo schema per la tabella:
+-------+----------------------+------+-----+---------+-------+
| 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: ho inserito in batch più inserti in modo che una singola query abbia quasi raggiunto la lunghezza massima (circa 16.000.000 di caratteri). Il database ora raggiunge il 1100% per due secondi, quindi scende al 100% per il resto del tempo. Il tempo totale è ora di 21 secondi, ovvero circa il 16% più veloce di quando ho iniziato.