У меня есть две таблиц:Mysql оптимизации: оператор Update на больших таблицах
playerstatstable, entrytable (см ниже)
playerstatstable имеет 100000 строк и entrytable имеет 1 мил строк
То, что я хочу сделать это обновление playerstatstable следующим
UPDATE playerstatstable set totalScore = totalScore+1000 where PlayerID = (Select PlayerID from entrytable where score = 1 and entryState = 5 and playerstatstable.PlayerID = entrytable.PlayerID);
1/10 записей будет в состоянии 5 и что около 1/5 будет иметь балл = 1;
Итак, у меня есть около 20 000 записей, связанных с 20 000 строк, которые нужно обновить.
1) Есть ли лучшее заявление о обновлении?
2) есть ли какой-либо индекс/ключ, который улучшит это?
CREATE TABLE `playerstatstable` (
`PlayerID` int(11) NOT NULL,
`totalScore` int(11) DEFAULT '0',
PRIMARY KEY (`PlayerID`),
UNIQUE KEY `PlayerID_UNIQUE` (`PlayerID`),
KEY `idx_m` (`monthTime`),
KEY `idx_w` (`weekTime`),
KEY `idx_d` (`dayTime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `entrytable` (
`EntryID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`PlayerID` int(10) unsigned DEFAULT '0',
`entryType` bit(1) DEFAULT b'0',
`entryState` int(11) DEFAULT '1',
`score` int(11) DEFAULT '0',
`rank` int(11) DEFAULT '0',
PRIMARY KEY (`EntryID`),
UNIQUE KEY `EntryID_UNIQUE` (`EntryID`)
) ENGINE=InnoDB
Да, избежать подзапрос. Кроме того, индекс по счету или entryState сделает это быстрее. –
Неправильный синтаксис ('from', workbench указывает на ошибку) ... – vbbartlett
Если вы используете MYSSQL, то для этого обновляется синтаксис. – RGV