Umlaute - Das absolute Killerfeature

Die Umlaute der deutschen Sprache scheinen mehr und mehr zum Killerfeature zu werden, denn eigentlich wollte ich gar nicht drüber bloggen, aber: VIVA hat es in über einem Jahr nicht hinbekommen, einen Fehler in ihrem Ticker (der in manchen Sendungen links oben läuft) zu korrigieren. Statt einem Umlaut, den ich da eigentlich erwarten würde, läuft nur ein viereckiger Kasten über den Bildschirm.

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.

Casio EX-V7 im Arsch

Weil Casio so scheiße ist, kann ich leider keine Bilder machen von meiner Schulung in Berlin (und dass direkt neben dem Checkpoint Charlie). Auf Amazon in den User-Kommentaren hat man mich vor der Kamera gewarnt, aber ich wollte nicht hören, die EX-V7 hat zwar tolle Features, aber leider scheinbar eine Menge Bugs. Gerade im Moment meldet sie nach dem Einschalten nur "Kamerastabilisator nicht verfügbar" und schaltet sich dann ab. Toll, danke Casio, mein nächstes Model wird ein anderer Hersteller.

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.

Server Umzug

Der erste Teil ist geschafft, mein Blog läuft nun auf meinem Vanager vServer. Die DNS-Einträge werde ich bei Domainfactory lassen, die sind einfach günstiger.

"Hallo, wie geht es ihnen?"

Nach dem ich neulich schon gar nicht mehr gefragt wurde, ob ich "Mayo oder Ketchup?" will, sondern ich hörte "Bei Ihnen war´s Mayo, gell?", wurde ich gestern mit "Hallo, wie geht es ihnen?" begrüßt.

Sollte mir das zu denken geben?

Vanager VServer Test [update]

Nachdem ich ja neulich einen V-Server-Test hier hatte und einige Werte veröffentlichte, hat sich vor ein paar Tagen ein Vanager-Mitarbeiter bei mir gemeldet. Er sei überzeugt von der Performance seiner Server und hat mir angeboten, dass System erneut zu testen. Ich hab jetzt einen neuen Zugang bekommen und kann einen Vanager-V-Server drei Monate lang kostenlos testen. Natürlich, um das vergleichen zu können, hab ich den gleichen Tarif gewählt.

Sobald ich Zeit hatte und Test-Ergebnisse vorliegen, werde ich die hier veröffentlichen.

Update (24.09. 08:10)

So, Server getestet und für gut befunden, seht selbst...

MusicBox.de Test

Neulich war es dann soweit. Ich hab mir zwei Lieder bei musicbox.de gekauft. Und ich muss sagen, dass das alles sehr gut gelaufen ist. Die ID3-Tags sind sauber ausgefüllt, die MP3s sind mit 320 KBit/s kodiert, also spitzen Qualität und es ging alles sehr schnell, auch die Download-Geschwindigkeit hat mein DSL-6000 ausgereizt.
Das einzige Manko ist der Musikkatalog. So produzierte Pappnasen wie der Godoj sind da vertreten, aber Peter Fox nicht. Dass ist halt das Problem mit den Plattenfirmen. So ein Angebot, Plattenfirmenübergreifend wäre optimal.

Hat der LHC die Welt schon zerstört?

Für alle, die sich nicht sicher sind, ob der Large Hadron Collider (kurz LHC) in Genf die Welt schon zerstört hat, gibt es seit kurzem diese Informationsseite.

Für alle die glauben, er könnte nicht auf "YES" springen sei hier ein JavaScript aus dem Quellcode veröffentlicht:

if (!(typeof worldHasEnded == "undefined")) {
document.write("YUP.");
} else {
document.write("NOPE.");
}

Sollte die Welt zerstört worden sein, die Seite aber nicht nicht auf den aktuellen Stand, dann gibt es zumindest diese Garnatie:

if the lhc actually destroys the earth & this page isn't yet updated please email xxxx@xxxx.org to receive a full refund