flog

dem Flo sein Blog

Ex-Feuerwehrman, Baskettballer, Schachspieler, House-Addict (since 1998), Radfahrer, Fitnessmensch und vor allem: Webprogrammierer aus Leidenschaft. Meine Hosen hab ich auch auf Facebook und Xing runtergelassen

MySQL Performance Tuning: Features / Learings

MySQL 5.1 Stable, Wann?

6. Dezember 2008, dieses Blog läuft jetzt aber schon auf 5.1

Kickfire, Magie, technische Raffinesse, oder Manpower?

Der "SQL-Chip" macht hier und da etwas Caching, hinter der Maschine steckt aber eigentlich nur brachiale Gewalt. Ein System mit ähnlicher Hardware (2 Quad Xeons, 16 GB Ram, SAS Platten, ...) wird ähnliche Benchmarks erreichen

Prepared Statements vs. Query Cache

Seit 5.1.17 wandern auch Prepared Statements in den Query-Cache. Diese Limitierung war besonders ärgerlich, da Prepared-Statements einem eine Menge Ärger ersparen können (Stichwort SQL-Injection), aber dadurch, dass die Ergebnisse nicht im Query-Cache landen, machen diese die Applikation langsamer im Vergleich zu "normalen" Queries.

"The query cache is not used for server-side prepared statements before MySQL 5.1.17. If you are using server-side prepared statements, consider that these statements will not be satisfied by the query cache." (Quelle)

Transaktion pro Sekunde

Jede abgeschlossene Transaktion (COMMIT) muss auf die Platte raus schreiben, dass bedeutet, pro COMMIT einmal write auf die Platte. Die mittlere Zugriffszeit ist eine Plattenumdrehung also lautet die Formel rein von der Spindel in der Platte: 1/(RPM/60) = Zugriffszeit. Bsp. 15.000 rpm: 1/(15000/60) = 0,004 s = 4ms
Das braucht schon alleine die Spindel / der Schreibkopf in der Platte um an der richtigen Position zu sein (im Schnitt).
Das bedeutet, dass pro Sekunde 250 Operationen auf die Platte durchgehen, mehr schafft die nicht (1/0,004 = 250). Alles mit mehr als 250 Transaktionen pro Sekunde wird also ein großer Spaß, vor allem: Das ist ein theoretischer Wert. Das Betriebssystem muss ja auch noch was machen.

Umkreissuche

Du bist an Punkt X und suchst alle Objekte im Umkreis von Y Kilometer. Ob ein Punkt innerhalb deines Umkreises ist ließe sich ganz einfach mit < a href="http://de.wikipedia.org/wiki/Satz_des_Pythagoras">Satz des Pythagoras berechnen. Problem: Du musst für jeden Punkt in der Datenbank eine komplexe Berechnung ausführen. Beispiel: X = (100/200) y = 30. Für jeden Punkt, der innerhalb des Umkreises ist gilt:

(100-x)^2 + (200-y)^2 <= 30^2
Das Problem hierbei: Ein Full-Table Scan. Was tun? Vorselektieren. Wie? Ein Viereck aufspannen:
x BETWEEN 100-30 AND 100+30
AND y BETWEEN 200-30 AND 200+30
Das lässt sich auch noch mit einem Index beschleunigen und ist zumindest ein Näherungswert. Dann per AND einfach noch die Bedinung von oben dran flanschen:
SELECT foo
FROM bar
WHERE x BETWEEN 100-30 AND 100+30
AND y BETWEEN 200-30 AND 200+30
AND POW(100-x,2)+POW(200-y,2) <= 30^2

MySQL Clipping-Feature Abschlaten

Seit MySQL 5.1 gibt es die Möglichkeit, das Clipping-Feature abzuschalten. Clipping ist dafür verantwortlich, dass man in ein TinyInt Feld zwar 300 reinschreibt, dann aber nur 255 drin steht, oder dass man einen String mit der Länge von z.B. 12 in ein CHAR(10) Feld speichern kann, dann aber halt einfach nur 10 Zeichen drin stehen. Kurz gesagt: Clipping ist Scheiße. Und das lässt sich abschalten:

SET GLOBAL SQL_MODE=STRICT_ALL_TABLES;
Dann macht MySQL kein Clipping mehr, sondern quitiert die Operation mit einer Fehlermeldung.
MySQL Doku

InnoDB Threads

InnoDB arbeitet intern mit mehrere Threads. Allerdings ist die Standardeinstellung so gewählt, dass nur maximal acht Threads gleichzeitig arbeiten können, alle anderen warten. Um das zu ändern muss man die Variable "innodb_thread_concurrency" einstellen. Faustformel für einen guten Wert: Anzahl_Cores * Anzahl_Platten * 2
Wobei Anzahl Platten die Platten sind, auf welchen das InnoDB-Datafile liegt (Stripping).

MySQL Schulung: Performance Tuning

Erster Tag

Es ist gerade kurze Pause, hier also mal in Kurzform, was bisher geschah:

  • 03:00 Wecker klingelt
  • 03:50 Aufstehen und ab ins Bad (es wird höchste Zeit)
  • 04:15 Raus aus dem Haus zur Bushaltestelle Stadtmitte
  • 04:49 Pünktlich ist der X3 in Reutlingen, hoffentlich auch so pünktlich in Stuttgart am Flughafen
  • 05:40 Mit kleiner Verspätung bin ich am Flughafen, schnell zum AirBerlin Check-In
  • 05:50 Ich hab die Boardingkarte in meiner Hand, jetzt zum Gate und noch schnell die aktuelle c't kaufen
  • 06:10 Ich sitz am Gate, Boarding sollte schon laufen, verspätet sich scheinbar etwas heute.
  • 06:15 Zwei junge Mädchen kommen angehastet, haben das mit der Zeitumstellung scheinbar verpasst und wollten wissen, ob der Flug schon weg ist ;-)
  • 06:20 Boarding
  • 06:30 Ich sitze am Fenster, vorletzte Reihe und kann beim Start die Lichterschlange bewundern, die sich die B28 nach Stuttgart quält
  • 07:33 Landung in Berlin-Tegel, trübes Wetter, es nieselt, wir fahren mit dem Bus zur Gepäckausgabe
  • 08:00 Mit der Tasche auf dem Rücken gehts zum Bus, dann mit der U-Bahn zum Checkpoint-Charlie
  • 08:40 Einchecken im Hotel: Wow, ich konnte sogar mit Bad statt Dusche wählen. Aber keine Zeit mehr fürs Zimmer, auf zum Schulungszentrum
  • 08:58 Yehaw, noch rechtzeitig geschafft, unterwegs sogar noch zwei Päckchen Taschentücher für jeweils 10 Cent gekauft

Mittagspause: Mittagessen in der Axel-Springer Kantine (ja, der Axel Springer) und festgestellt, dass mein Hotel vier Sterne hat und eine Tageskarte Sauna und Wellnessbereich 10 € kostet. Das werde ich mir auf jeden Fall noch gönnen in der Hoffnung, dass man mir Bademantel und Handtuch stellt.

Zur Schulung selber: Der Dozent hat echt was drauf, arbeitet selber für Sun (dem Eigentümer von MySQL, falls das jemand noch nicht mitbekommen hat ;-)) und hat eine echt gute Art, sein Wissen rüber zu bringen.

Erster Tag zu Ende und wir sind sogar 20 Minuten früher mit dem Stoff fertig geworden als geplant. Kurz zum Dozenten noch was: Er hat früher in einer Internet-Agentur gearbeitet und hat damals den Session-Support für PHP gehakt. Arbeitet seit ein paar Jahren für MySQL AB (inzwischen zu Sun gehörend) und hält Schulungen und Vorträge auf diversen Veranstaltungen.

Zweiter Tag

Heute morgen um 06:30 Uhr kam der Weckruf, allerdings nicht der vom Hotel (der war auf 07:00 Uhr bestellt), sondern der von meiner Mutter. Ich hab dann noch Nachrichten geschaut, mich danach geduscht, frisch gemacht, einen kurzen Abstecher in den Saunabereich (nur um mal zu schauen, was denn da so wäre) und dann raus aus dem Hotel, ab zur Bäckerei Kamps (die liegt direkt auf dem Weg) und erst mal was zum Frühstücken organisiert und dann auf hier her ins Schulungszentrum. Ein StarBucks Kaffee liegt auch hier auf dem Weg, dass muss werde schon mal ausprobieren.

Zur Schulung: Im "Student Guide" hab ich gelesen, dass wir neben den üblichen Dingen (Schema/Datenbank Design, Indexing, Statement Tuning) auch die Storage Engines durchsprechen werden. Dabei gibt es natürlich für MyISAM und InnoDB eigene Kapitel aber auch die neue, mit MySQL 6 kommende Falcon wird ein großes Thema sein.

Der Dozent ist auch da, die Klasse vollständig, ich meld mich später wieder mit Updates.

Mittagspause, wieder lecker in der Axel Springer Kantine, diese Woche ist "Schnitzeljagd" jeden Tag ein anderes Schnitzel, heute mit Käse und Zwiebeln überbacken und Pommes. Wunderbar. Den Dozenten mal auf Kickfire angesprochen. Das hat nichts mit technischer Raffinesse zu tun, viel mehr mit brachialer Gewalt, dieser "SQL-Prozessor" machst nichts weiter als hier und da Cachen, aber ansonsten ist das Ding einfach nur schnell, wegen zwei Quad-Core Xeon`s, 16 GB Ram, SAS Platten ...

Gestern Nachmittag dann noch sehr spannende Themen: Umkreissuche mit MySQL, wie macht XING das mit dem "Sie kennen Person X über" eigentlich, MySQL Indexing und Caching (ja, Prepared Statements werden seit MySQL 5.1.17 auch in den Query-Cache gelegt).

Abends ging es dann noch mit dem Dozenten und einem anderen Kursteilnehmer in die "Hackeschen Höfe" eine Berliner Weiße trinken. War ganz ok, eine reicht dann aber auch. Abends bin ich dann in meinem Hotel noch in die Sauna gegangen, drei Saunagänge in annähernd zweieinhalb Stunden.

Dritter Tag

Heute morgen kam wieder ein privater Weckruf, diesmal allerdings schon um kurz nach vier von meiner Frau, sie geht jetzt zur Arbeit (Frühschicht im Altenheim). Ich hab ihr von dem Hotel und der Sauna und dem Kurs vorgeschwärmt, alles perfekt hier. Danach hab ich mich wieder schlafen gelegt, weil ja um sieben der Weckruf vom Hotel kommt. Den hab ich dann auch gehört, aufgestanden, frisch gemacht, Richtung Schulungszentrum marschiert, unterwegs noch was zum Frühstück gekauft und an der Ampel den anderen Kursteilnehmer von gestern Abend wieder getroffen. Zusammen sind wir dann die restlichen 300m zum Schulungszentrum gelaufen. Heute geht es im Kurs weiter mit Server-Konfiguration und dem Thema MyISAM und INNODB.

Wow, man kann MySQL dieses Clipping abgewöhnen. Das "Feature", dass dafür sorgt, dass man eine 300 in ein TinyInt (max. 255) schreiben kann und dann aber einfach 255 drin steht, oder das beim schreiben in ein CHAR Feld, einfach der Rest, der nicht reinpasst abgeschnitten wird, kommentarlos. Der Zauberbefehl lautet: SET GLOBAL SQL_MODE=STRICT_ALL_TABLES;
Dann bekommt man eine Fehlermeldung geliefert. MySQL 5.1 machts möglich.

Wir haben dann noch die Innereien von MyISAM und InnoDB besprochen, InnoDB machen wir morgen noch gar fertig und dann wollen wir einen MySQL-Cluster aufsetzen, gehört zwar nicht zum Kurs, aber wir haben die Zeit und es macht Laune sagt der Dozent.

Vierter (letzter) Tag

Aus dem Hotel ausgecheckt, und ab ins Schulungszentrum. Die Vorfreude auf den Cluster und Falcon wächst :-)

So, InnoDB noch einiges gelernt. Da gibt es noch einige Features, die ich nicht kannte, bzw. die man einstellen sollte, ja sogar muss. Falcon haben wir uns nur kurz angeschaut, weil wir a) keine 6er MySQL hier installiert hatten und b) im allgemeinen mehr Interesse an dem Cluster bestand. Clustering haben wir dann besprochen und auch hier zum Laufen bekommen, das ging echt ratz fatz. Außerdem haben wir eine Buchempfehlung bekommen zum Thema Bäume in SQL: Joe Celko's Trees and Hierarchies in SQL for Smarties

Empfehlungen für weiterführende Kurse: Der MySQL High Availability kurs (weil Cluster und Replikation drin durchgesprochen wird) und das MySQL Boot Camp (von Morgens acht bis Abends acht alles um MySQL).

Tipp!

Der Kurs wird nicht günstiger, nur dadurch, dass er in Deutschland stattfindet. Folgendes Beispiel:

Ort Kosten Flug Hotel Gesamt
Berlin 1599 € 190 € 235 € 2024 €
Beijing (Peking) US$ 999 (~ 790 €) 800 € (ca.) 400 € (ca.) 1992 €

Der Dozent hat uns Empfohlen, dass wir das genau prüfen sollten, denn z.B. Kuala Lumpur, Neu Deli, usw. sind sehr günstig, vor allem durch den Wechselkurs zum Dollar. Die Mehrkosten für den Flug sind alleine dadurch schon wieder drin und das Hotel ist in der Regel günstiger (bzw. bei gleichem Geld eine höherer Standard). Das lässt sich dann auch prima mit Urlaub kombinieren und man spart sich gleich noch was dabei. Die Dozenten sind dort nicht von vor Ort, sondern kommen von irgendwo her, er selbst hat auch schon mehrmals Schulungen in Asien gehalten.

Berlin, Berlin, wir fahren nach Berlin

Am Montag morgen geht es los. MySQL Performance-Tuning Schulung in Berlin. Montag morgen per AirBerlin nach Tegel, Übernachtung im Hotel um die Ecke und Donnerstag Abend Rückflug von Tegel. Wenn Internet vorhanden, werde ich mich von dort melden.

Oracle Schulung: SQL Tuning Workshop

Erster Tag

Ich bin also nun angekommen, kein Stau, hab circa eineinhalb Stunden gebraucht bis hier her nach Karlsruhe. Direkt hier am TRIA Trainingszentrum ist eine Baustelle, warum ich ein klein wenig im Kreis um das Gebäude herumfahren musste, bis ich dann die Zufahrtsstrasse gefunden hab.

13:40 Uhr: Der Vormittag war recht viel Theorie und ging alles sehr behäbig, die Dozentin hat nur leider ein paar Probleme bei der englischen Aussprache, man weiß aber, was gemeint ist.

15:50 Uhr: Wir sind jetzt erst bei Kapitel drei angekommen, sehr schlecht. Bis um 17:00 Uhr sollten wir eigentlich schon Kapitel sechs fertig haben. Das wird nichts mehr. Die Dozentin verhaspelt sich immer und kommt immer wieder ganz weit vom Thema ab, macht tausend Exkurse und wir kommen nicht voran, bis jetzt noch nichts spannendes dabei gewesen.

17:00 Uhr: Der erste Tag ist rum, wie erwartet haben wir es nur bis zur Lektion drei geschafft. Morgen früh geht es dann mit Lektion vier weiter.

Zweiter Tag

08:40 Uhr: Ich bin da, die Fahrt hierher ging wieder ohne Stau, ein/zwei Idioten, sonst alles OK. Mal sehen, wie weit wir heute kommen, wir müssen eigentlich noch die Kapitel vier bis sechs von gestern aufarbeiten plus sieben bis zehn und Workshop eins und zwei. Ich bin gespannt.

13:15 Uhr: Die Mittagspause ist rum. Wir sind noch vor der Pause mit Kapitel fünf fertig geworden und fangen jetzt mit Kapitel sechs an (was wir eigentlich schon gestern hätten fertig haben müssen). Mein erster Eindruck, dass diese Frau leider sehr wenig Ahnung hat, oder zumindest nicht über die Fähigkeit verfügt, Wissen zu vermitteln, bestätigt sich leider heute auch.

14:45 Uhr: Nachmittags-Pause, wir haben Kapitel sechs geschafft. Wir sind also mehr als einen halben Tag hinterher. Und wie es halt so ist, kommen die spannenden Themen erst immer gegen Ende des Kurses und da werden wir dann im Fast-Forward Modus durchskippen müssen

17:30 Uhr: Wir haben die Übungen weg gelassen und dafür noch das Kapitel acht fertig gemacht. Jetzt müssen wir morgen noch sechs Kapitel schaffen. Die beiden Workshops, die bis jetzt schon hätten stattfinden müssen, gabs nicht, wurden kommentarlos gestrichen.

Dritter Tag

8:40 Uhr: Bin angekommen, ging mal wider problemlos. Ich hol mir jetzt erst mal einen Kaffee, dann werde ich mir die Übungen, die gestern ausgefallen sind ansehen bis um neun.

09:30 Uhr: Sie hat doch Ahnung, aber halt irgendwie gar kein Gespür für Zeit. Dass es erst jetzt zeigt, dass sie schon Ahnung hat, ist leider etwas spät, wir hätten am Anfang deutlicher schneller machen müssen.

11:00 Uhr: Kapitel neun wäre geschafft, es geht jetzt an Kapitel zehn. Ich bin noch circa. drei Stunden hier, wobei davon eine Stunde Mittagspause ist. Auch wenn die anderen länger hier bleiben, fertig werden die nicht mehr, ganz zu schweigen von den drei Workshops, die stattfinden hätten sollen. Dazu hat sie uns allerdings, zumindest zu einem Workshop, kurz erklärt was das Ziel dieses Workshops gewesen sei und hat uns das gezeigt. Besser als beim ersten Workshop, der kommentarlos übergangen wurde.

12:00 Uhr: Sie hat doch keine Ahnung: Dreimal versucht, den Access-Advisor zu starten, drei mal gescheitert und keine Ahnung warum. Ganz schlecht, dadurch ist dann wieder wertvolle Zeit verloren gegangen. Sie hat aber versprochen, sich das Problem in der Mittagspause anzuschauen und uns danach den Access Advisor zu präsentieren.

13:10 Uhr: Mittagspause ist rum, sie hat sich daran erinnert, dass ich schon um 14:00 Uhr weg muss, mal sehen, was wir bis dahin noch schaffen. Allerdings hat sie sich nicht daran erinnert, dass sie das mit dem Access Advisor machen wollte.

14:00 Uhr: Schluss für mich, wir sind bis Kapitel zwölf gekommen es fehlen mir zwei Kapitel, die werd ich dann am Wochenende selber durchgehen.

Fazit

Das hätte ich auch günstiger haben können. Die Dozentin war leider nicht wirklich überzeugend, hat kaum bis gar keine praktische Erfahrung (zumindest lässt sie uns nicht daran teilhaben, wenn es denn so wäre). Meistens liest sie nur vor, wenn sie das mal nicht macht, dann erzählt sie unwichtiges, oder sie spielt mit der Datenbank herum und probiert sachen aus, vertippt sich. Ganz schlecht vorbereitet.
Und katastrophal war natürlich die Zeitplanung. Am ersten Tag schon nur die Hälfte schaffen ist komplett inakzeptabel, vor allem wenn ich sie schon am Montag darauf vorbereitet habe, dass ich Mittwoch um 14:00 Uhr gehen muss, weil ich einen Termin hab, der sich nicht verschieben lässt. Unter diesen Bedingungen hinter dem Zeitplan her zu hinken, und zwar einen dreiviertel Tag, das geht mal gar nicht.