MySQL очень тормозит при вставке записей: innodb_flush_log_at_trx_commit не помогает

Господа, я некоторое время пытался заставить MySQL делать сравнительно быструю вставку записей в таблицу.

Самое очевидное перебрал: индексы не мешают, сама таблица стоит из двух полей (идентификатор и строка), памяти вроде бы хватает.

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

При этом сервер явно упирается в диск, это видно на следующей картинке: введите сюда описание изображения

Как я тестировал:

  1. самое простое - написал хранимую вида

     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
    
  2. Написал маленькую программу на C++, которая тоже вставляет записи в цикле.

Я решил, что, скорее всего, дело в фиксации транзакций - просиходит запись на диск после каждой вставки.

Тогда я попробовал в файл /etc/my.cnf дописать в конец строчку

    innodb_flush_log_at_trx_commit = 2

и перезапустил докер - контейнер с MySQL.

Ничего не изменилось. При innodb_flush_log_at_trx_commit = 0 тоже ничего не изменилось.

Вставить больше 20-25 записей в секунду - не удается.

Что еще можно попробовать?

Заранее спасибо за советы.


Ответы (1 шт):

Автор решения: S.H.

Господа, спасибо за отклик, думаю, что я решил проблему. Кажется, дело было в том, что 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 инсертов.

В общем, я думаю, дело во второй строке этого конфига.

Теперь загрузка диска и процессора при массовой вставке выглядит прилично:

введите сюда описание изображения

Большое спасибо всем, кто откликнулся!

→ Ссылка