У меня есть код, который мне нужно вставить в таблицу MySQL. Я использую движок хранения innodb. Могут быть одновременные клиенты, вставляющие в таблицу раз. Мои запросы на вставку иногда занимают до 50 секунд. Я вижу очень меньше времени блокировки, но время выполнения довольно большое. Ниже приведено время, зафиксированное в журналах медленных запросов:
Время запроса: 51.106628 Время блокировки: 0,000043 Количество отправленных строк: 0 Проверенных строк: 0
Может кто-нибудь объяснить, где mysql тратит столько времени на вставку в таблицу, где обычно это занимает порядка миллисекунд.
Ниже приведены вещи, которые я сузил:
1. Между параллельными вставками не может быть разногласий, поскольку вставки mysql могут блокировать пробелы, но здесь в моей таблице используется первичный ключ с автоинкрементным увеличением.
2. У меня есть настройка, где происходит сброс на диск после каждой фиксации транзакции, поэтому не может быть случая, когда очистка может отставать, вызывая остановку вставки.
Я попытался сохранить таблицу из двух столбцов, где один столбец - это автоматически увеличиваемый PK, а другой - просто строковый столбец. Я запустил 100 потоков для вставки в таблицу, и в моих журналах медленных запросов было зафиксировано несколько вставок в течение 10 секунд, где, как обычно, вставки занимали несколько миллисекунд, поэтому, похоже, возникает общая проблема случайных медленных вставок.
(из комментария)
Проблема случайной задержки возникает и с очень простой структурой. например.
CREATE TABLE test_con_insert (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
thread int(11) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
insert into test_con_insert (thread) values(1);
медленные журналы запросов: # Query_time: 10.014465 Lock_time: 0.000035 Rows_sent: 0 Rows_examined: 0 вставить в значения test_con_insert (thread) (3833); 100 параллельных потоков, используемых для вставки в эту таблицу.4, захватывает медленный запрос.