MySQL очень тормозит при вставке записей: innodb_flush_log_at_trx_commit не помогает
Господа, я некоторое время пытался заставить MySQL делать сравнительно быструю вставку записей в таблицу.
Самое очевидное перебрал: индексы не мешают, сама таблица стоит из двух полей (идентификатор и строка), памяти вроде бы хватает.
Попытки переместить таблицу в память ( ENGINE=memory ) не отражаются на производительности. Скорость сети - не влияет, этот вывод я делаю потому, что при запросах на select производительность на несколько порядков выше.
При этом сервер явно упирается в диск, это видно на следующей картинке:

Как я тестировал:
самое простое - написал хранимую вида
CREATE DEFINER=`konst`@`192.168.0.101` PROCEDURE `speed_test1`() BEGIN DECLARE i INT DEFAULT 1; DELETE FROM test_table; WHILE i<250 DO INSERT INTO test_table (id, name) VALUES (i, 'test_string'); SET i=i+1; END WHILE; ENDНаписал маленькую программу на C++, которая тоже вставляет записи в цикле.
Я решил, что, скорее всего, дело в фиксации транзакций - просиходит запись на диск после каждой вставки.
Тогда я попробовал в файл /etc/my.cnf дописать в конец строчку
innodb_flush_log_at_trx_commit = 2
и перезапустил докер - контейнер с MySQL.
Ничего не изменилось. При innodb_flush_log_at_trx_commit = 0 тоже ничего не изменилось.
Вставить больше 20-25 записей в секунду - не удается.
Что еще можно попробовать?
Заранее спасибо за советы.
Ответы (1 шт):
Господа, спасибо за отклик, думаю, что я решил проблему. Кажется, дело было в том, что mysql писал binlog. Когда я привел /etc/my.cnf в следующее состояние
[mysqld]
disable_log_bin
innodb_flush_log_at_trx_commit = 2
innodb_buffer_pool_size = 4096M
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
secure-file-priv = ""
то я с легкостью получил около 800 инсертов в секунду. И это - при работе по сети (локалка, 100 Мб). Думаю, что если перейти на 1Gb сеть - получу около 1000 инсертов.
В общем, я думаю, дело во второй строке этого конфига.
Теперь загрузка диска и процессора при массовой вставке выглядит прилично:
Большое спасибо всем, кто откликнулся!
