2009-05-05 13 views
8

Mam tabelę MyISAM z więcej niż 10^7 wierszy. Dodając do niego dane, muszę zaktualizować ~ 10 wierszy na końcu. Czy szybciej je usunąć, a następnie wstawić nowe, czy szybsze jest aktualizowanie tych wierszy? Dane, które powinny zostać zaktualizowane, nie są częścią indeksu. A co z fragmentacją indeksu/danych?Wydajność MySQL DELETE lub UPDATE?

Odpowiedz

20

UPDATE jest zdecydowanie o wiele szybszy.

Po zapisaniu UPDATE zapisy w tabeli są po prostu przepisywane nowymi danymi.

Kiedy DELETE, indeksy powinny być aktualizowane (pamiętaj, usunąć cały wiersz nie tylko kolumn trzeba zmodyfikować) i Bloki danych mogą zostać przeniesione (jeśli trafisz limitu PCTFREE)

A wszystko należy to zrobić ponownie pod numerem INSERT.

Dlatego należy zawsze używać

INSERT ... ON DUPLICATE KEY UPDATE 

zamiast REPLACE.

Pierwsza z nich to operacja UPDATE w przypadku naruszenia klucza, natomiast druga z nich to DELETE/INSERT.

3

Szybsza aktualizacja. Można również użyć INSERT ON duplikat KEY UPDATE

INSERT INTO table (a,b,c) VALUES (1,2,3) 
    ON DUPLICATE KEY UPDATE c=c+1; 

Więcej szczegółów czytać aktualizować documentation

+0

Stary, Byłeś szybszy w 3 minuty, co to za niesprawiedliwość ?!) –

1

Logicznie DELETE + ADD = 2 akcje, UPDATE = 1 akcję. Również usuwanie i dodawanie nowych zmian powoduje zapisywanie identyfikatorów w auto_increment, więc jeśli te rekordy zawierają relacje, które mogłyby zostać zerwane, lub też wymagają aktualizacji. Poszedłbym do aktualizacji.

0

przy użyciu aktualizacji, w której kolumna = "coś" powinna używać indeksu, o ile kryteria wyszukiwania znajdują się w indeksie (to, czy wyszukiwanie lub skanowanie jest zupełnie innym problemem).

jeśli robisz te aktualizacje dużo, ale nie "mają indeks na kolumnie kryteriów, polecam tworzenie indeksu na kolumnie, której używasz. to powinno pomóc przyspieszyć sprawę.

Powiązane problemy