Очень медленно при вставке данных в таблицу MySQL 5.7 с использованием Java (произошла блокировка)

Я недавно перенес и обновил свою базу данных с MySQL 5.5 до MySQL 5.7. До этого все работало на старом сервере. Но теперь я обнаружил ошибку в своем Java-приложении, которое я использую (в старой системе) для вставки данных в таблицу. Как ни странно, запрос работает нормально, если я выполню его на консоли.

INSERT INTO TMPALL 
SELECT U.PERNR, U.SEQUENCE, U.STARTDATE, U.ENDDATE, PERSONNELAREA, PERSONNELSUBAREA, EMPLOYEEGROUP, EMPLOYEESUBGROUP, NOMINALPOKOK, FULLNOMINALPOKOK, NOMINALPREMIUM, FULLNOMINALPREMIUM, IFNULL(AMOUNT, 0), IFNULL(FULLAMOUNT, 0), NOMINALPOKOK + NOMINALPREMIUM + IFNULL(AMOUNT, 0), FULLNOMINALPOKOK + FULLNOMINALPREMIUM + IFNULL(FULLAMOUNT, 0) 
FROM TMPJOINUP U 
LEFT JOIN TMPJOINJG J 
ON U.PERNR = J.PERNR 
AND U.STARTDATE BETWEEN J.STARTDATE AND J.ENDDATE 
AND U.ENDDATE BETWEEN J.STARTDATE AND J.ENDDATE

Этот запрос, если он выполняется с помощью приложения Java (я построил его с использованием mysql-connector-java-5.1.40 и HikariCP-2.5.1), займет более 5000 секунд, чтобы получить результат из 193 085 строк. Но если я выполню его в клиентской консоли MySQL, это займет всего 5 секунд. Также все другие запросы к серверу, от клиентов MySQL, приложений PHP и приложений Java, работают нормально. Кто-нибудь может посоветовать мне эту ситуацию?

Это структура таблицы:

CREATE TABLE `TMPALL` (
  `PERNR` varchar(8) COLLATE latin1_general_ci DEFAULT NULL,
  `SEQUENCE` smallint(5) unsigned DEFAULT NULL,
  `STARTDATE` date DEFAULT NULL,
  `ENDDATE` date DEFAULT NULL,
  `PERSONNELAREA` varchar(4) COLLATE latin1_general_ci DEFAULT NULL,
  `PERSONNELSUBAREA` varchar(4) COLLATE latin1_general_ci DEFAULT NULL,
  `EMPLOYEEGROUP` varchar(1) COLLATE latin1_general_ci DEFAULT NULL,
  `EMPLOYEESUBGROUP` varchar(2) COLLATE latin1_general_ci DEFAULT NULL,
  `NOMINALPOKOK` decimal(13,2) DEFAULT NULL,
  `FULLNOMINALPOKOK` decimal(13,2) DEFAULT NULL,
  `NOMINALPREMIUM` decimal(13,2) DEFAULT NULL,
  `FULLNOMINALPREMIUM` decimal(13,2) DEFAULT NULL,
  `NOMINALJG` decimal(13,2) DEFAULT NULL,
  `FULLNOMINALJG` decimal(13,2) DEFAULT NULL,
  `NOMINALCOMBINED` decimal(13,2) DEFAULT NULL,
  `FULLNOMINALCOMBINED` decimal(13,2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci 

CREATE TABLE `TMPJOINUP` (
  `PERNR` varchar(8) COLLATE latin1_general_ci DEFAULT NULL,
  `SEQUENCE` smallint(5) unsigned DEFAULT NULL,
  `STARTDATE` date DEFAULT NULL,
  `ENDDATE` date DEFAULT NULL,
  `PERSONNELAREA` varchar(4) COLLATE latin1_general_ci DEFAULT NULL,
  `PERSONNELSUBAREA` varchar(4) COLLATE latin1_general_ci DEFAULT NULL,
  `EMPLOYEEGROUP` varchar(1) COLLATE latin1_general_ci DEFAULT NULL,
  `EMPLOYEESUBGROUP` varchar(2) COLLATE latin1_general_ci DEFAULT NULL,
  `POKOK` varchar(4) COLLATE latin1_general_ci DEFAULT NULL,
  `NOMINALPOKOK` decimal(13,2) DEFAULT NULL,
  `FULLNOMINALPOKOK` decimal(13,2) DEFAULT NULL,
  `PREMIUM` varchar(4) COLLATE latin1_general_ci DEFAULT NULL,
  `NOMINALPREMIUM` decimal(13,2) DEFAULT NULL,
  `FULLNOMINALPREMIUM` decimal(13,2) DEFAULT NULL,
  `NOMINALCOMBINED` decimal(13,2) DEFAULT NULL,
  `FULLNOMINALCOMBINED` decimal(13,2) DEFAULT NULL,
  KEY `IDX1` (`PERNR`,`STARTDATE`,`ENDDATE`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci

CREATE TABLE `TMPJG` (
  `PERNR` varchar(8) COLLATE latin1_general_ci DEFAULT NULL,
  `SEQUENCE` smallint(5) unsigned DEFAULT NULL,
  `STARTDATE` date DEFAULT NULL,
  `ENDDATE` date DEFAULT NULL,
  `WAGETYPE` varchar(4) COLLATE latin1_general_ci DEFAULT NULL,
  `AMOUNT` decimal(13,2) DEFAULT NULL,
  `FULLAMOUNT` decimal(13,2) DEFAULT NULL,
  KEY `IDX1` (`PERNR`,`STARTDATE`,`ENDDATE`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci

И, наконец, я получил это, когда выполнить show engine innodb status;

---TRANSACTION 853444993, ACTIVE 3279 sec
mysql tables in use 3, locked 3
1302 lock struct(s), heap size 155856, 272621 row lock(s), undo log entries 74324
MySQL thread id 428981, OS thread handle 139794084808448, query id 5078166 localhost 127.0.0.1 root Sending data
INSERT INTO TMPALL SELECT U.PERNR, U.SEQUENCE, U.STARTDATE, U.ENDDATE, PERSONNELAREA, PERSONNELSUBAREA, EMPLOYEEGROUP, EMPLOYEESUBGROUP, NOMINALPOKOK, FULLNOMINALPOKOK, NOMINALPREMIUM, FULLNOMINALPREMIUM, IFNULL(AMOUNT, 0), IFNULL(FULLAMOUNT, 0), NOMINALPOKOK + NOMINALPREMIUM + IFNULL(AMOUNT, 0), FULLNOMINALPOKOK + FULLNOMINALPREM

Я полагаю, что некоторые блокировки обнаружены при исполнении Java, но он работает нормально на клиенте MySQL.

0 ответов

Другие вопросы по тегам