Обновление соединения MySQL работает медленно - PullRequest
0 голосов
/ 05 июля 2018

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

У меня есть две таблицы: в alltranscur 35 358 строк, а в acctnumcust 86 103 строк.

Запрос:

update alltranscur a inner join acctnumcust d
on a.acctNumber=d.acctNum
set
a.custID=d.custID

Занимает очень много времени (5 минут 58,29 секунды, соответствует ~ 22 000 строк). Я также альтернативно написал это как:

update alltranscur a, acctnumcust d
set
a.custID=d.custID
where a.acctNumber=d.acctNum

с тем же результатом.

Операторы создания таблицы:

CREATE TABLE `alltranscur` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`custID` varchar(200) DEFAULT NULL,
`acctNumber` int(11) DEFAULT NULL,
... other columns
PRIMARY KEY (`id`),
KEY `acctNumber` (`acctNumber`),
... other keys
CONSTRAINT `alltranscur_ibfk_8` FOREIGN KEY (`custID`) REFERENCES `custdata` (`custID`) ON UPDATE CASCADE
... other foreign keys
) ENGINE=InnoDB AUTO_INCREMENT=5226303 DEFAULT CHARSET=latin1

и

CREATE TABLE `acctnumcust` (
`acctnum` varchar(50) NOT NULL,
`custid` varchar(200) NOT NULL,
PRIMARY KEY (`acctnum`),
KEY `custid` (`custid`),
KEY `acctnum` (`acctnum`,`custid`),
CONSTRAINT `acctnumcust_ibfk_1` FOREIGN KEY (`custid`) REFERENCES `custdata` (`custID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

Если я

explain
update alltranscur a inner join acctnumcust d
on a.acctNumber=d.acctNum
set
a.custID=d.custID

Я получаю:

+----+-------------+-------+-------+-----------------+------------+---------+---------------+-------+-------------+
| id | select_type | table | type  | possible_keys   | key        | key_len | ref           | rows  | Extra       |
+----+-------------+-------+-------+-----------------+------------+---------+---------------+-------+-------------+
|  1 | SIMPLE      | d     | index | PRIMARY,acctnum | custid     | 202     | NULL          | 85152 | Using index |
|  1 | SIMPLE      | a     | ref   | acctNumber      | acctNumber | 5       | pcb.d.acctnum |     1 | Using where |
+----+-------------+-------+-------+-----------------+------------+---------+---------------+-------+-------------+

Я бы подумал, что MySQL использовал бы первичный ключ в acctnum или, возможно, даже комбинационный ключ в acctnum / custID. Но это не так.

Это так же быстро, как и запрос? В прошлом я делал совместные обновления для таблиц одинакового размера, и они не заняли так много времени Я что-то упускаю из этих таблиц? Есть ли способ заставить его работать быстрее?

1 Ответ

0 голосов
/ 05 июля 2018

Основная причина вашей проблемы - это, скорее всего, то, что вы объединяете свои 2 таблицы в столбцы с разными типами данных

`acctNumber` int(11) DEFAULT NULL,
`acctnum` varchar(50) NOT NULL,

where a.acctNumber=d.acctNum

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

Измените тип данных столбца acctnum в таблице acctnumcust на INT (11), и ваша проблема должна быть решена

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...