Anzeige - [Interessiert an einer Anzeige?]
(?) Tags raten (?) (edit)
 
Reply to this topicStart new topicStart Poll
> MySQL - Update im Hintergrund ausführen
Martin J
Geschrieben am: Fr 25.04.2008, 18:20
Report PostQuote Post

AyomRank 4
********

Gruppe: Member (aktiv)
Beiträge: 64
Mitglied seit: 25.05.2007


Hi,

ich habe eine recht datenbanklastige Anwendung, basierend auf der Perl-DBI und Mysql 5.1. Es werden sehr viele UPDATE Anweisungen produziert, die mittlerweile den Bottleneck der Anwendung darstellen. Das Ergebnis der UPDATE Anweisung ist nicht kritisch, es muss nicht sofort, sondern nur zeitnah aktualisiert werden und selbst wenn mal etwas verloren ginge, wäre es nicht schlimm.

Meine Frage: Bei INSERT gibt es ja die Möglichkeit DELAYED anzugeben und nicht auf das Resultat zu warten. Bei UPDATE gibt es soetwas nicht.

Hier sind ja ein paar SQL Spezialisten versammelt, vielleicht habt ihr einen Tipp, welcher Ansatz Sinn machen würde, bzw. wo man vielleicht sauf schon bestehende Klassen zurückgreifen kann:
  • Updates innerhalb der Anwendung sammeln und periodisch mehrere auf einmal ausführen
  • einen externen Daemon oder so einrichten, der an einem Socket lauscht und selber eine Queue bildet, so dass die eigentliche Anwendung mit voller Geschwindigkeit weiterläuft
  • Lösungen in MySQL direkt (Speicherbasierte Tabellen, andere Engines...)

Die Datenbank und die Indizes sind bereits alle optimal, auch der Server selbst ist grundsätzlich einigermassen passend konfiguriert.

vg,
martin
Top
PMEmail Poster
Top
 
 
Sven K
#2 Geschrieben am: Fr 25.04.2008, 19:42 (+01:22)
Report PostQuote Post

AyomRank 4
********

Gruppe: Member (aktiv)
Beiträge: 134
Mitglied seit: 27.10.2006


stichwort low priority


--------------------
idiot confusion device | Computer Forum
Top
PMEmail Poster
Top
 
jAuer
Jürgen Auer - freiberufl. Programmierer
#3 Geschrieben am: Fr 25.04.2008, 19:44 (+00:02)
Report PostQuote Post

AyomRank 9
Group Icon

Gruppe: Experten Entwicklung
Beiträge: 2156
Mitglied seit: 4.02.2006


Eigentlich sind das noch zu wenige Informationen, um das Problem brauchbar zu identifizieren.

Bsp.:
- Das Update einer einzelnen Zeile kann zu lange dauern, weil Indices fehlen / falsch sind.
- Bei der Ausführung einer Seite werden 20 Datensätze geholt und die zeilenweise aktualisiert - anstatt in einem Rutsch.
- Die Ermittlung der neuen Werte ist aufwendig, blockiert, weil parallel schon wieder andere Updates laufen.
- Der Server ist insgesamt unterdimensioniert, das Problem tritt nur eher zufällig bei den Update-Anweisungen auf.


Technisch kann man bsp. die zu aktualisierenden Daten in eine neue Tabelle schreiben. Zusätzlich läuft irgendeine Dauerschleife, die diese Tabelle überwacht, die Updates vornimmt und die verarbeiteten Zeilen löscht. Dann wäre das völlig entkoppelt. Oder man schreibt die zu aktualisierenden Werte in eine zusätzliche Tabelle und macht das Update im folgenden Schritt. Damit sind Updatesperre und Select-Sperre zur Ermittlung der neuen Werte voneinander entkoppelt.

Beim MS-SqlServer kann man 'Dirty Reads' zulassen. Damit müssen Abfragen, die Werte zurückgeben, nicht auf die Fertigstellung von Änderungen warten. Theoretisch können dann zwar ab und an fehlerhafte Werte zurückgegeben werden, aber das könnte (laut den Hinweisen) tolerierbar sein.


--------------------
Web-Anwendung 3.0: Ein Online-Kalender für Termine vieler Filialen.

server-daten: Web-Datenbanken als Online - CRM - Lösung.
Konzentrieren Sie sich auf Ihr Kerngeschäft - nutzen Sie eine schlanke, schnelle Online-Datenbank von verschiedenen Standorten.
Top
PMEmail PosterUsers Website
Top
 
Martin J
#4 Geschrieben am: Fr 25.04.2008, 21:19 (+01:34)
Report PostQuote Post

AyomRank 4
********

Gruppe: Member (aktiv)
Beiträge: 64
Mitglied seit: 25.05.2007


QUOTE (jAuer @ Fr 25.04.2008, 20:44)
Eigentlich sind das noch zu wenige Informationen, um das Problem brauchbar zu identifizieren.
...
Technisch kann man bsp. die zu aktualisierenden Daten in eine neue Tabelle schreiben. Zusätzlich läuft irgendeine Dauerschleife, die diese Tabelle überwacht, die Updates vornimmt und die verarbeiteten Zeilen löscht. Dann wäre das völlig entkoppelt. Oder man schreibt die zu aktualisierenden Werte in eine zusätzliche Tabelle und macht das Update im folgenden Schritt. Damit sind Updatesperre und Select-Sperre zur Ermittlung der neuen Werte voneinander entkoppelt.

Ok, vielen Dank für die Tipps so weit.

@Sven:
da habe ich auch zuerst geschaut, aber in der MySQL Doku steht:
QUOTE
Wenn Sie das Schlüsselwort LOW_PRIORITY  angeben, wird die Ausführung von UPDATE  verzögert, bis kein Client mehr aus der Tabelle liest.


Hier stehts nochmal etwas expliziter: http://osdir.com/ml/db.mysql.general/2002-06/msg01049.html (wobei ich mich liebend gerne vom Gegenteil überzeugen liesse)

@jAuer (Dein SQL Tutorial ist schön)
Ein paar von den von Dir genannten Sachen kann ich ausschliessen:
Indizes sind ok
Ermittlung neuer Werte ok (werden mittels fetchall schon vorher in den Speicher gelesen)
Server (Hardware als auch mysqld) ok

Aus Deinen anderen Punkten werde ich jetzt erstmal die neue Tabelle und das Zusammenfassen der Updates aufgreifen.
Ich werde mal testweise die Inserts in eine temporäre Tabelle im Speicher schreiben und dann periodisch als Updates auf einmal einspielen. Das dürfte deutlich einfacher sein, als den Dämon zu schreiben. smile.gif

Ich schreibe dann mal in einer Woche, ob es sich gelohnt hat.

MsSql kenne ich leider nicht, da ich im Laufe der Jahre vieles auf Unix optimiert habe. Zumindest Stand 2006 war MySQL (>5.0) für meine Zwecke besser geeignet, als Postgres oder die kleine Oracle Version.
Top
PMEmail Poster
Top
 
jAuer
Jürgen Auer - freiberufl. Programmierer
#5 Geschrieben am: Sa 26.04.2008, 09:52 (+12:33)
Report PostQuote Post

AyomRank 9
Group Icon

Gruppe: Experten Entwicklung
Beiträge: 2156
Mitglied seit: 4.02.2006


QUOTE (Martin J @ Fr 25.04.2008, 21:19)
Aus Deinen anderen Punkten werde ich jetzt erstmal die neue Tabelle und das Zusammenfassen der Updates aufgreifen. 
Ich werde mal testweise die Inserts in eine temporäre Tabelle im Speicher schreiben und dann periodisch als Updates auf einmal einspielen.  Das dürfte deutlich einfacher sein, als den Dämon zu schreiben. smile.gif


Ich hatte da eigentlich bloß an einen einfachen Cronjob gedacht. Nicht gleich ein eigener Dämon.

QUOTE (Martin J @ Fr 25.04.2008, 21:19)
@jAuer (Dein SQL Tutorial ist schön)


danke für das Lob. Und schön, wenn die Texte nützlich sind und Leser finden.


--------------------
Web-Anwendung 3.0: Ein Online-Kalender für Termine vieler Filialen.

server-daten: Web-Datenbanken als Online - CRM - Lösung.
Konzentrieren Sie sich auf Ihr Kerngeschäft - nutzen Sie eine schlanke, schnelle Online-Datenbank von verschiedenen Standorten.
Top
PMEmail PosterUsers Website
Top
 
manuel
#6 Geschrieben am: Sa 26.04.2008, 12:15 (+02:23)
Report PostQuote Post

AyomRank 5
**********

Gruppe: Member (aktiv)
Beiträge: 261
Mitglied seit: 14.01.2004


http://phpperformance.de/verzoegertes-schr...ktes-schreiben/

passt doch perfekt zu deiner Frage das Thema.
wie schon erwähnt kannst du bei Update die Priorität angeben, mit dennen diese abgearbeitet werden.
Top
PM
Top
 
mainlink
Mainlink Internet
#7 Geschrieben am: Sa 26.04.2008, 16:18 (+04:03)
Report PostQuote Post

AyomRank 5
**********

Gruppe: Member (aktiv)
Beiträge: 207
Mitglied seit: 12.09.2007


Nebenbei bemerkt: Die gesamte Seite ist sehr lesenswert. Da schreibt jemand mit Ahnung von der Materie.


--------------------
Sichere (managed) Rootserver, Webspace und Mailaccounts unter FreeBSD: Mainlink Internet
Top
PMEmail PosterUsers WebsiteMSN
Top
 
Thema wird von 0 Benutzer(n) gelesen (0 Gäste und 0 anonyme Benutzer)
0 Mitglieder:
Trackback-Url: http://www.ayom.com/track/t/24179

Topic Options Reply to this topicStart new topicStart Poll

 


> Ähnliche Themen
MySQL Abfrage von einer Tabelle webdoktor 276 18 Fr 8.08.2008, 19:03
MySQL Datenbankoptimierung Coach 124 4 Do 7.08.2008, 05:47
PR Update ? PA 594 20 Di 5.08.2008, 17:15
Suche kleinere Jobs (HTML, PHP, MySQL...) Oliver Pester 74 0 Di 5.08.2008, 17:03
(S) Programmierer PHP MySQL Dachs 62 0 Mo 4.08.2008, 20:48
MySQL Abfrage von zwei Tabellen webdoktor 117 6 Do 31.07.2008, 15:26
PR Update 07/2008 Lila 246 9 Di 29.07.2008, 16:36
MySQL Benutzernamen Coach 129 4 Fr 25.07.2008, 21:53
MYSQL - Benutzer koennen nicht.... jerry70 117 3 Di 15.07.2008, 15:55
mysql too many connections Tuemmel 319 14 Mo 30.06.2008, 17:28




Anzeige - [Interessiert an einer Anzeige?]



Anzeigen


[Interessiert an einer Anzeige?]