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
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
.
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
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.
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ę.
Zamiast usuwania lub aktualizowania danych ze względu na wydajność, rozważam partycjonowanie.
http://dev.mysql.com/doc/refman/5.1/en/partitioning-range.html
To pozwoli na utrzymanie danych historycznych i nie pogorszyć wydajność.
- 1. Nomenklatura SQL: "Zapytanie" lub "Polecenie" dla INSERT/UPDATE/DELETE?
- 2. SQLiteStatement wykonać SELECT/INSERT/DELETE/UPDATE
- 3. PHP5 SQLite3 rekompilacji dla UPDATE, DELETE LIMIT
- 4. Mysql Bulk Update
- 5. Wordpress update mysql table
- 6. Cofnij polecenie mysql UPDATE
- 7. MySQL ON UPDATE CASCADE nie CASCADEing
- 8. python mysql DELETE nie działa
- 9. Wydajność funkcji MySql Xml?
- 10. PHP MYSQL UPDATE, jeśli istnieje lub INSERT, jeśli nie?
- 11. Kolumna "Update Timestamp" MySQL - Trigger
- 12. MySQL - zapytanie UPDATE z LIMIT
- 13. MySql wyś wietla wydajność
- 14. Selektywnie delete głównie zduplikowane rekordy z MySQL
- 15. default_scope breaks (update | delete | destroy) _all w niektórych przypadkach
- 16. najskuteczniej obsługi Create, Update, Delete z kodem Entity Framework Pierwszy
- 17. Co się stało z poleceniami Update and Delete mojego TableAdaptera?
- 18. LinqDataSource nie obsługuje właściwości Select po włączeniu operacji Delete, Insert lub Update
- 19. MySQL Atomic UPDATE w InnoDB vs MyISAM
- 20. Python MySQL - WYBIERA pracę, ale nie DELETE?
- 21. MySQL - Big DELETE na wielu tabelach
- 22. Słaba wydajność INFORMATION_SCHEMA.key_column_usage w MySQL
- 23. Mysql utworzyć tabelę ze stwardnieniem klucza obcego Delete SET NULL
- 24. Wyzwalacz MySQL PRZED UPDATE - zmień wartość
- 25. wpis MySQL zduplikowane na klucz na UPDATE
- 26. MySql: jeśli wartość istnieje UPDATE jeszcze INSERT
- 27. MySQL: Jak uzyskać zmiany ostatniego UPDATE
- 28. MySQL UPDATE dodawać dane do kolumny
- 29. Jak poprawić wydajność MYSQL na UNION ALL?
- 30. wydajność - aplikacje wielowątkowe lub wieloprocesowe
Stary, Byłeś szybszy w 3 minuty, co to za niesprawiedliwość ?!) –