我有一个数据包日志数据库,几乎从未查询过。它只需要在插入时快速。我之所以使用InnoDB,是因为我想保持ACID合规性,因为即使丢失单个数据包也可能损害我们的客户。在性能调整方案中,我通过多个数据库连接将1,000,000个数据包发送到服务器。但是,无论我在my.cnf中使用什么设置,我都无法使mysqld进程在具有12个核心的系统上使用超过900%的CPU。(盒子上没有其他东西。)
我设置了以下内容
innodb_file_per_table = 1
innodb_write_io_threads = 64
innodb_read_io_threads = 64
innodb_thread_concurrency = 0
如果使用MyISAM,则可以在大约6秒钟内获得所有写入的数据包。但是InnoDB大约需要25。我可以让MySQL使用其余的系统资源并更快地插入吗?
编辑:这是表的架构:
+-------+----------------------+------+-----+---------+-------+
| 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:我已经将更多的插入批量处理,以便单个查询接近最大长度(大约16,000,000个字符)。现在,数据库会在两秒钟内飙升至1100%,然后在其余时间内降至100%。现在总时间为21秒,比开始时快16%。