Performanceprobleme bei DELETE mit mySQL
Martin23
- datenbank
0 Ilja1 Sven Rautenberg
Hallo,
ich habe eine mySQL-Datenbank mit einer Tabelle, die folgende Felder hat:
id, gender, firstname, lastname, mobile, email, users_id (als Fremdschlüssel)
email, mobile, id und users_id sind unique und indiziert.
DELETE-Anfragen werden wie folgt durchgeführt:
DELETE FROM tabelle WHERE id = x OR id = y OR id = z
wobei durchaus mehrere Tausend Reihen gleichzeitig gelöscht werden können - und das ist genau das Problem. Wenn ich bspw. 3.000 Reihen lösche, dauert es 5-10s. Das ist viel zu lange, denn es ist durchaus möglich dass 300.000 Reihen gleichzeitig gelöscht werden müssen und ich der User soll nicht ne halbe Stunde warten müssen!
Habe schon nach Optimierungsansätzen gesucht, aber hauptsächlich gefunden, dass Suchanfragen über vernünftige Indizes verbessert werden können, die meiner Meinung nach bei mir gegeben sind.
Weiß jemand, wie ich die Performance sonst noch steigern kann?
Vielen Dank
moin,
DELETE FROM tabelle WHERE id = x OR id = y OR id = z
wenn id UNIQUE ist und du 300.000 Datensätze löscht, bedeutet dass, du hast 299.999 OR operatoren ? grundsätzlich würde ich dir zu IN raten, also in dem falle.
DELETE FROM tabelle WHERE id IN (x, y, z);
es ist durchaus möglich dass 300.000 Reihen gleichzeitig gelöscht werden müssen und ich der User soll nicht ne halbe Stunde warten müssen!
das läßt sich nicht in jedem fall so einfach linear hochrechnen, kann sein, muss aber nicht.
Ilja
Moin!
wobei durchaus mehrere Tausend Reihen gleichzeitig gelöscht werden können - und das ist genau das Problem. Wenn ich bspw. 3.000 Reihen lösche, dauert es 5-10s. Das ist viel zu lange, denn es ist durchaus möglich dass 300.000 Reihen gleichzeitig gelöscht werden müssen und ich der User soll nicht ne halbe Stunde warten müssen!
Löschen dauert nun mal länger, je mehr Datensätze und Indices betroffen sind.
Wenn du eine komplette Tabelle schnell und komplett löschen willst, erspart dir "TRUNCATE table" viel zeitlichen Aufwand im Vergleich zu "DELETE FROM table".
Habe schon nach Optimierungsansätzen gesucht, aber hauptsächlich gefunden, dass Suchanfragen über vernünftige Indizes verbessert werden können, die meiner Meinung nach bei mir gegeben sind.
Ja, das Suchen der betroffenen Datensätze wird vom Index beschleunigt. Das Löschen aber nicht, das dauert eben.
Weiß jemand, wie ich die Performance sonst noch steigern kann?
http://dev.mysql.com/doc/refman/5.1/de/delete-speed.html
- Sven Rautenberg