2013-06-06 3 views
0

У меня есть две таблиц: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 

ответ

1

Пожалуйста, попробуйте это.

UPDATE t1 set t1.totalScore = t1.totalScore+1000 
from playerstatstable t1 inner join entrytable t2 
on t.PlayerID = t2.PlayerID 
and t2.score = 1 and t2.entryState = 5 

Для MYSQL

UPDATE 
playerstatstable t1, entrytable t2 
set t1.totalScore = t1.totalScore+1000 
where t.PlayerID = t2.PlayerID 
and t2.score = 1 and t2.entryState = 5 
+0

Да, избежать подзапрос. Кроме того, индекс по счету или entryState сделает это быстрее. –

+0

Неправильный синтаксис ('from', workbench указывает на ошибку) ... – vbbartlett

+0

Если вы используете MYSSQL, то для этого обновляется синтаксис. – RGV

Смежные вопросы