Bookmarks

Yahoo Gmail Google Facebook Delicious Twitter Reddit Stumpleupon Myspace Digg

Search queries

wwwxxx0cm, www.webdp.net, Event 9 IIS log failed to write entry, wwwxxx jeffs, Catastrophic failure Unexpected method call sequence. 0x8000ffff (-2147418113)., ksh lock a file, [unixODBC][Driver Manager]Driver's SQLAllocHandle on SQL_HANDLE_DBC failed, sed: -e expression #1, char 1: unterminated address regex, procmail + change subject, w2ksp4.exe download

Links

XODOX
Impressum

#1: Partitionierung großer Tabellen

Posted on 2007-06-12 15:14:03 by idontlikespam

Hallo NG,

ich habe hier bei einigen Webanwendungen teilweise Tabellen von knapp
3GB Größe. Auf einem ordentlich ausgestattetem Server l=E4uft auf SuSE
Linux 9.3 eine MySQL 5.0.18 for i686 Installation.

Nun w=FCrde ich aus verst=E4ndlichen Performancegr=FCnden gerne die gro=DFen
Tables partitionieren. Da das aber ein Livesystem ist, m=F6chte ich
keine Experimente mit Betas machen.

- Wer hat denn Erfahrungen mit Partitioning unter MySQL 5.1.19.0? Ist
das da wirklich stable?
- Wie gehe ich eine Partitionierung der Gro=DFen Tabellen richtig an?


Vielen Dank f=FCr Eure Hilfe!
Dennis

Report this message

#2: Re: Partitionierung großer Tabellen

Posted on 2007-06-12 15:24:03 by Christian Kirsch

Am 12.06.2007 15:14 schrieb Dennis Winter:
> Hallo NG,
>
> ich habe hier bei einigen Webanwendungen teilweise Tabellen von knapp
> 3GB Größe. Auf einem ordentlich ausgestattetem Server läuft auf SuSE
> Linux 9.3 eine MySQL 5.0.18 for i686 Installation.
>
> Nun würde ich aus verständlichen Performancegründen gerne die großen

*gibt* es denn Performanceprobleme?

> Tables partitionieren. Da das aber ein Livesystem ist, möchte ich
> keine Experimente mit Betas machen.
>
> - Wer hat denn Erfahrungen mit Partitioning unter MySQL 5.1.19.0? Ist
> das da wirklich stable?
> - Wie gehe ich eine Partitionierung der Großen Tabellen richtig an?

Das dürfte von den Daten und den Abfragen abhängen. Du kannst nach
Jahreszahlen partitionieren oder nach Postleitzahlen, vielleicht auch
nach Schuhgrößen.

Report this message

#3: Re: Partitionierung großer Tabellen

Posted on 2007-06-12 15:40:00 by idontlikespam

On 12 Jun., 15:24, Christian Kirsch <c...@bru6.de> wrote:
> *gibt* es denn Performanceprobleme?

Ja, die gibt es. In unregelm=E4ssigen Abst=E4nden h=E4ngt sich MySQL bei
vielen Anfragen auf. Nach einem Restart des D=E4mons (wenn es klappt,
andernfalls Reboot) l=E4uft alles wieder ordentlich. Nur ist dann
gelegentlich die eine oder andere gro=DFe Tabelle gecrasht. Ein Repair
dauert bei diesen Tabellen dann bis zu 25 Min.

> > - Wie gehe ich eine Partitionierung der Gro=DFen Tabellen richtig an?
>
> Das d=FCrfte von den Daten und den Abfragen abh=E4ngen. Du kannst nach
> Jahreszahlen partitionieren oder nach Postleitzahlen, vielleicht auch
> nach Schuhgrößen.

Da meine Elemente keine Schuhe haben, wie w=E4re es mit dem
Prim=E4rschl=FCssel? Also einem Autoinkrement-Wert?

Report this message

#4: Re: Partitionierung großer Tabellen

Posted on 2007-06-12 15:57:33 by Christian Kirsch

Am 12.06.2007 15:40 schrieb Dennis Winter:
> On 12 Jun., 15:24, Christian Kirsch <c...@bru6.de> wrote:
>> *gibt* es denn Performanceprobleme?
>
> Ja, die gibt es. In unregelmässigen Abständen hängt sich MySQL bei
> vielen Anfragen auf. Nach einem Restart des Dämons (wenn es klappt,
> andernfalls Reboot) läuft alles wieder ordentlich. Nur ist dann
> gelegentlich die eine oder andere große Tabelle gecrasht. Ein Repair
> dauert bei diesen Tabellen dann bis zu 25 Min.
>

Und die fraglichen Anfragen hast Du Dir schon mit EXPLAIN angesehen,
es gibt keine brauchbare Fehlermeldung etc.?

Was Du da beschreibst, hört sich jedenfalls weniger nach einem
Performance- als nach einem Stabilitätsproblem an. Dem sollte man
vielleicht auf den Grund gehen.

>>> - Wie gehe ich eine Partitionierung der Großen Tabellen richtig an?
>> Das dürfte von den Daten und den Abfragen abhängen. Du kannst nach
>> Jahreszahlen partitionieren oder nach Postleitzahlen, vielleicht auch
>> nach Schuhgrößen.
>
> Da meine Elemente keine Schuhe haben, wie wäre es mit dem
> Primärschlüssel? Also einem Autoinkrement-Wert?
>

Warum nicht. Andererseits: Warum? Ich habe gerade mal bei Oracle
nachgelesen. Die haben, wenn ich das richtig verstanden habe, drei
Verfahren: "partition by range", bei dem Du selber die Wertebereiche
einer Spalte vorgibst, anhand dann die Tabelle zerlegt wird. Oder
"Partition by hash". In diesem Fall legst Du die Anzahl der
Partitionen und die Spalte fest und Oracle benutzt eine Hashfunktion
auf der angegebenen Spalte, die die Daten möglichst gleichmäßig auf
die Partitionen verteilt. Als drittes dannList-Partitionierung, wenn
man Enumerations oder ähnliches hat.

Was ich bislang darüber gelesen habe, ging in der Regel von einer
semantischen Bedingung aus (also *nicht* dem PK) - sowas wie eine
Tabelle pro Jahr oder eine pro PLZ-Bereich oder so. Wenn natürlich
Deine Anfragen alle ohnehin den PK im WHERE benutzen, dann kannst Du
auch danach partitionieren. Wenn es aber um andere Kriterien geht,
dann bringt die Partitionierung nach dem PK m.E. wenig.

Report this message

#5: Re: Partitionierung großer Tabellen

Posted on 2007-06-12 16:15:21 by idontlikespam

On 12 Jun., 15:57, Christian Kirsch <c...@bru6.de> wrote:
> Und die fraglichen Anfragen hast Du Dir schon mit EXPLAIN angesehen,
> es gibt keine brauchbare Fehlermeldung etc.?

Nein. Das ist ein ausgefeiltes Tool mit mehreren Entwicklern dran. Bis
ich mich da reingefuchst habe dauert das zu lange. Als die Tabellen
noch kleiner waren ging alles wie am Schn=FCrchen...

> Was Du da beschreibst, h=F6rt sich jedenfalls weniger nach einem
> Performance- als nach einem Stabilit=E4tsproblem an. Dem sollte man
> vielleicht auf den Grund gehen.

Habe ich getan und keine brauchbare Fehlermeldung und damit keine
Quelle gefunden ausser, dass die Kiste performancem=E4ssig nicht mehr
mitkommt. Wenn es soweit ist, schie=DFt die Prozessorlast f=FCr MySQL in
die H=F6he, sodass der Kernel nicht mal mehr Logfiles schreibt. Das is
halt Essig f=FCrs debuggen...

> > Da meine Elemente keine Schuhe haben, wie w=E4re es mit dem
> > Prim=E4rschl=FCssel? Also einem Autoinkrement-Wert?
>
> Warum nicht. Andererseits: Warum? Ich habe gerade mal bei Oracle
> nachgelesen. Die haben, wenn ich das richtig verstanden habe, drei
> Verfahren: "partition by range", bei dem Du selber die Wertebereiche
> einer Spalte vorgibst, anhand dann die Tabelle zerlegt wird. Oder
> "Partition by hash". In diesem Fall legst Du die Anzahl der
> Partitionen und die Spalte fest und Oracle benutzt eine Hashfunktion
> auf der angegebenen Spalte, die die Daten m=F6glichst gleichmäßig auf
> die Partitionen verteilt. Als drittes dannList-Partitionierung, wenn
> man Enumerations oder =E4hnliches hat.
>
> Was ich bislang dar=FCber gelesen habe, ging in der Regel von einer
> semantischen Bedingung aus (also *nicht* dem PK) - sowas wie eine
> Tabelle pro Jahr oder eine pro PLZ-Bereich oder so. Wenn nat=FCrlich
> Deine Anfragen alle ohnehin den PK im WHERE benutzen, dann kannst Du
> auch danach partitionieren. Wenn es aber um andere Kriterien geht,
> dann bringt die Partitionierung nach dem PK m.E. wenig.

Okay, ich habe meine Schuhgrößen gefunden. Wenn eine Tabelle
partitioniert ist, ist das allerdings f=FCr die weitere Verwendung der
bisherigen Queries nicht relevant, oder?

Ist die Partitionierung nach Schuhgrößen eigentlich dynamisch? Sprich,
wenn eine neue Schuhgröße dazukommt wird automatisch eine Partition
hierf=FCr angelegt.

Sorry, das klingt jetzt etwas so, als w=E4re ich zu doof
http://dev.mysql.com/doc/refman/5.1/de/partitioning.html zu lesen.
Aber wirklich durchsteigen tu ich im Moment dort noch nicht.

Report this message

#6: Re: Partitionierung großer Tabellen

Posted on 2007-06-12 16:26:08 by Christian Kirsch

Am 12.06.2007 16:15 schrieb Dennis Winter:

>
> Okay, ich habe meine Schuhgrößen gefunden. Wenn eine Tabelle
> partitioniert ist, ist das allerdings für die weitere Verwendung
> der bisherigen Queries nicht relevant, oder?
>

Die Frage verstehe ich nicht. Meinst Du "Ich kann die Queries weiter
so benutzen wie bisher" (Antwort: Ja) oder meinst Du irgendwas anderes?

> Ist die Partitionierung nach Schuhgrößen eigentlich dynamisch?
> Sprich, wenn eine neue Schuhgröße dazukommt wird automatisch eine
> Partition hierfür angelegt.
>

Ich vermute: Nein. Denn die Partitionierung dürfte ein einmaliger
Prozess sein (in CREATE/ALTER TABLE). Du kannst natürlich einen
INSERT- bzw. UPDATE-Trigger schreiben, der nachguckt, ob "eine neue
Schuhgröße" hinzugekommen ist und dann bei Bedarf eine neue Partition
anlegt.

<Werbung>
Um so etwas ähnliches geht es in dem iX-Artikel zu Partitionierung in
PostgreSQL
http://www.heise.de/kiosk/archiv/ix/07/04/141_Teile_und_herr sche
</Werbung>

> Sorry, das klingt jetzt etwas so, als wäre ich zu doof
> http://dev.mysql.com/doc/refman/5.1/de/partitioning.html zu lesen.
> Aber wirklich durchsteigen tu ich im Moment dort noch nicht.
>

Entscheidend dürften diese beiden Stellen sein:

> Die Partitionierungsimplementierung in MySQL 5.1 befindet sich noch
> in der Entwicklung und ist noch nicht bereit für
> Produktionsumgebungen. Etwas Ähnliches gilt für den Inhalt dieses
> Kapitels: Manche der hier beschriebenen Features sind in
> Wirklichkeit noch gar nicht implementiert, und andere funktionieren
> noch nicht ganz so wie beschrieben.

Das hört sich in meinen Ohren nicht so an, als ob man jetzt schon eine
wichtige Anwendung darauf aufsetzen möchte.

Vielleicht doch erstmal Fehlersuche? Wenn's die MySQL-Logs nicht
bringen, vielleicht die des Web-Servers, wenn es eine Web-Anwendung
ist? Ich gestehe, dass ich den Verdacht habe, Eure Queries könnten
nicht so prima sein, wie sie sein sollten (fehlende Indizes, ein
vergessenes WHERE, was ein Kreuzprodukt auslöst oder so...). Denn von
Stabilitätsproblemen, wie Du sie beschreibst, hört man hier fast nie.

Report this message

#7: Re: Partitionierung großer Tabellen

Posted on 2007-06-12 16:38:22 by idontlikespam

On 12 Jun., 16:26, Christian Kirsch <c...@bru6.de> wrote:
> Die Frage verstehe ich nicht. Meinst Du "Ich kann die Queries weiter
> so benutzen wie bisher" (Antwort: Ja) oder meinst Du irgendwas anderes?

Neinein, hast genau richtig verstanden! :)

> > Ist die Partitionierung nach Schuhgrößen eigentlich dynamisch?
> > Sprich, wenn eine neue Schuhgröße dazukommt wird automatisch eine
> > Partition hierf=FCr angelegt.
>
> Ich vermute: Nein. Denn die Partitionierung d=FCrfte ein einmaliger
> Prozess sein (in CREATE/ALTER TABLE). Du kannst nat=FCrlich einen
> INSERT- bzw. UPDATE-Trigger schreiben, der nachguckt, ob "eine neue
> Schuhgröße" hinzugekommen ist und dann bei Bedarf eine neue Partition
> anlegt.

Guter Tip, danke!

> [...]
>
> Vielleicht doch erstmal Fehlersuche? Wenn's die MySQL-Logs nicht
> bringen, vielleicht die des Web-Servers, wenn es eine Web-Anwendung
> ist? Ich gestehe, dass ich den Verdacht habe, Eure Queries k=F6nnten
> nicht so prima sein, wie sie sein sollten (fehlende Indizes, ein
> vergessenes WHERE, was ein Kreuzprodukt ausl=F6st oder so...). Denn von
> Stabilit=E4tsproblemen, wie Du sie beschreibst, h=F6rt man hier fast nie.

Gut, dann schau ich mal ob ich die letzten Queries vor dem heutigen
Crash irgendwo f=FCr ein EXPLAIN rausbuddeln kann.

Ich kenne solche Probleme auch nicht von MySQL. Zu Anfang war die Swap-
Partition des Servers etwas zu klein geraten, aber dieses Problem ist
auch schon lange behoben. Schaumer mal...

Vielen Dank f=FCr Deine Zeit! Bin ein gutes St=FCck weitergekommen! Wenn
ich den Fehler gefunden habe poste ich das Ergebnis hier.


Viele Grüße
Dennis

Report this message

#8: Re: Partitionierung großer Tabellen

Posted on 2007-06-12 17:06:58 by Robert Klemme

On 12.06.2007 15:57, Christian Kirsch wrote:
> Am 12.06.2007 15:40 schrieb Dennis Winter:
>> On 12 Jun., 15:24, Christian Kirsch <c...@bru6.de> wrote:
>>> *gibt* es denn Performanceprobleme?
>> Ja, die gibt es. In unregelmässigen Abständen hängt sich MySQL bei
>> vielen Anfragen auf. Nach einem Restart des Dämons (wenn es klappt,
>> andernfalls Reboot) läuft alles wieder ordentlich. Nur ist dann
>> gelegentlich die eine oder andere große Tabelle gecrasht. Ein Repair
>> dauert bei diesen Tabellen dann bis zu 25 Min.
>>
>
> Und die fraglichen Anfragen hast Du Dir schon mit EXPLAIN angesehen,
> es gibt keine brauchbare Fehlermeldung etc.?
>
> Was Du da beschreibst, hört sich jedenfalls weniger nach einem
> Performance- als nach einem Stabilitätsproblem an. Dem sollte man
> vielleicht auf den Grund gehen.
>
>>>> - Wie gehe ich eine Partitionierung der Großen Tabellen richtig an?
>>> Das dürfte von den Daten und den Abfragen abhängen. Du kannst nach
>>> Jahreszahlen partitionieren oder nach Postleitzahlen, vielleicht auch
>>> nach Schuhgrößen.
>> Da meine Elemente keine Schuhe haben, wie wäre es mit dem
>> Primärschlüssel? Also einem Autoinkrement-Wert?
>>
>
> Warum nicht. Andererseits: Warum? Ich habe gerade mal bei Oracle
> nachgelesen. Die haben, wenn ich das richtig verstanden habe, drei
> Verfahren: "partition by range", bei dem Du selber die Wertebereiche
> einer Spalte vorgibst, anhand dann die Tabelle zerlegt wird. Oder
> "Partition by hash". In diesem Fall legst Du die Anzahl der
> Partitionen und die Spalte fest und Oracle benutzt eine Hashfunktion
> auf der angegebenen Spalte, die die Daten möglichst gleichmäßig auf
> die Partitionen verteilt. Als drittes dannList-Partitionierung, wenn
> man Enumerations oder ähnliches hat.

Wenn ich mich richtig erinnere, kannst du sogar über mehrere Spalten hashen.

> Was ich bislang darüber gelesen habe, ging in der Regel von einer
> semantischen Bedingung aus (also *nicht* dem PK) - sowas wie eine
> Tabelle pro Jahr oder eine pro PLZ-Bereich oder so. Wenn natürlich
> Deine Anfragen alle ohnehin den PK im WHERE benutzen, dann kannst Du
> auch danach partitionieren. Wenn es aber um andere Kriterien geht,
> dann bringt die Partitionierung nach dem PK m.E. wenig.

Ich bin mir nicht sicher, was du mit "semantischer Bedingung" meinst.
Partitionierung ist i.d.R. dafür da, große Datenmengen handhabbar zu
halten. Da geht es um das physische Schema vs. dem logischen Schema
(das ändert sich durch Partitionierung ja auch nicht). Oracle kann z.B.
partition pruning, d.h., wenn der Optimizer feststellt, dass die
gefragten Daten nur in n Partitionen sein können, schaut er auch nur die
an. Ein weiterer Vorteil ist i.d.R., dass man ganze Partitionen droppen
kann, was viel schneller geht, als die Datensätze zu löschen.

Das Anlegen (und manchmal auch Wegschmeißen) von Partitionen ist i.d.R.
Wartungsarbeit. Wenn man nach Zeitstempeln partitioniert, macht es auch
Sinn, einen cron-Job darauf anzusetzen, der einmal pro Tag / Woche /
Monat eine neue Partition erzeugt. Bei Hash-Partitionierung (in Oracle)
kann man keine neuen Partitionen hinzufügen, wenn ich mich recht
erinnere. Das macht auch keinen Sinn, wenn man sich mal überlegt, wie
Hash-Partitionierung arbeitet. :-)

Da wir hier keine Infos über die Daten haben, ist es schwer zu einer
Partitionierungsstrategie zu raten. Dafür sollte man die Verteilung der
Daten sowie CRUD-Operationen berücksichtigen.

Ciao

robert

Report this message

#9: Re: Partitionierung großer Tabellen

Posted on 2007-06-12 17:27:57 by Christian Kirsch

Robert Klemme schrieb:

> Ich bin mir nicht sicher, was du mit "semantischer Bedingung" meinst.

"inhaltlich", im Gegensatz zu "formal", wenn Du so willst. Also "Jahr"
statt "Primary key". Letzterer ist ja in der Regel irgendwas
synthetisches, das keinerlei Bedeutung hat.

Report this message

#10: Re: Partitionierung großer Tabellen

Posted on 2007-06-13 09:56:42 by Christian Kirsch

[posted & mailed]

Das hier könnte noch interessant sein:

http://datacharmer.blogspot.com/2007/06/use-51-partitions-in -production-today.html

Report this message

#11: Re: Partitionierung großerTabellen

Posted on 2007-06-13 11:57:25 by Sven Paulus

Dennis Winter <idontlikespam@denniswinter.de> wrote:
> Habe ich getan und keine brauchbare Fehlermeldung und damit keine
> Quelle gefunden ausser, dass die Kiste performancem=E4ssig nicht mehr
> mitkommt. Wenn es soweit ist, schie=DFt die Prozessorlast f=FCr MySQL in
> die H=F6he, sodass der Kernel nicht mal mehr Logfiles schreibt. Das is
> halt Essig f=FCrs debuggen...

Was sagt mysqladmin processlist in diesem Augenblick? Reicht es, wenn Du
evtl. die fragliche Connection killst? Was sagen iostat und vmstat in
derartigen Momenten?

Tendenziell klingt es fuer mich, als waere da ein ganz anderes Problem
(irgendwelche Queries, die den kompletten Datenbestand in temporary tables
sortieren und Dir das IO-Subsystem damit plattmachen, o.ae.), dass durch d=
ie
Partitionierung sich nicht ploetzlich magisch loest, sondern eher noch
bloeder werden koennte, weil ich mir schon vorstellen kann, dass JOINs etc=
..
dann teurer sind.

Report this message

#12: Re: Partitionierung grosser Tabellen

Posted on 2007-06-13 14:17:22 by Axel Schwenke

Dennis Winter <idontlikespam@denniswinter.de> wrote:
>
> ich habe hier bei einigen Webanwendungen teilweise Tabellen von knapp
> 3GB Größe. Auf einem ordentlich ausgestattetem Server läuft auf SuSE
> Linux 9.3 eine MySQL 5.0.18 for i686 Installation.
>
> Nun würde ich aus verständlichen Performancegründen gerne die großen
> Tables partitionieren.

Partitionierung löst Performanceprobleme nur in wenigen Spezialfällen.
Im wesentlichen dann, wenn
- kein Index benutzt werden kann
- eine Operation sich nur auf eine (oder einige wenige) Partition(en)
einer Tabelle beschränkt.

Wenn - wie du später schreibst - die Datenbank erst langsam wurde als
nennenswert Daten darin lagen, ist es wahrscheinlich daß die Queries
einfach nur keine Indexe nutzen und deswegen langsamer werden.

Es ist dann wesentlich sinnvoller, Indexe hinzuzufügen (und notfalls
Queries so umzuformulieren, daß sie die auch benutzen können) als die
Daten - anscheinend auch noch recht planlos - zu partitionieren.

> Da das aber ein Livesystem ist, möchte ich
> keine Experimente mit Betas machen.
>
> - Wer hat denn Erfahrungen mit Partitioning unter MySQL 5.1.19.0? Ist
> das da wirklich stable?

Die ganze 5.1 Release ist Beta. Mehr muß man dazu eigentlich nicht
sagen. Schau dir halt auf bugs.mysql.com an, ob da Bugs dabei sind,
die dich beißen könnten. Über bisher unbekannte Bugs kann man natur-
gemäß noch nichts sagen...

> - Wie gehe ich eine Partitionierung der Großen Tabellen richtig an?

Zuerst mal müßtest du analysieren, welche Queries genau langsam sind
und warum. Danach könnte man überlegen, ob partitionieren da hilft.

Mit dem Ansatz aus Giuseppes Blog (der Link den Christian gepostet hat)
kannst du ja recht einfach mal probieren, ob 5.1 mit Partitionen über-
haupt etwas bringt.


XL

Report this message