У меня есть база данных журнала пакетов, которая почти никогда не запрашивается. Это просто должно быть быстро на вставках. Я использую InnoDB, потому что хотел бы поддерживать соответствие ACID, поскольку даже потеря одного пакета может нанести ущерб нашим клиентам. В сценарии настройки производительности я отправляю 1 000 000 пакетов на сервер через несколько подключений к БД. Но независимо от того, какие настройки я использую в my.cnf, я не могу заставить процесс mysqld использовать более 900% ЦП в системе с 12 ядрами. (На коробке больше ничего не работает.)
Я установил следующее
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% быстрее, чем когда я начинал.