Alle Jahre wieder…
Irgendwann April letzten Jahres kackte eine unserer Applikation dauernd ab (also, so haben es die User beschrieben, eigentlich liefen nur DB-Queries für 15 Minuten…) – die Ursache war eine ständig aufgerufene Funktion, die über ein SELECT-blubb-WHERE-bla-OR-dingens-Statement DB-Last erzeugte. An sich ja kein Problem – aber MySQL hat nur die tolle Eigenschaft, bei OR-Joins insgesamt nur einen Index nutzen zu können*. Nun ja, wenn dann die Table From Hell gezogen wird (da ist wirklich alles und jeder in der Applikation irgendwie referenziert) mit einer unglücklich großen zweiten Tabelle führt das dann schon mal dazu, das full table scans über etliche Mio Einträge durchgeführt werden.
Nun ja, das führte dann heute mal wieder zu einem mit Schwung an die Wand fahren – irgendwann ab 13:30 rum ist eine Tabelle so groß geworden, dass für die darauf ausgeführten Queries mit OR temporäre Tabellen auf die Platte geschrieben wurden, dann lief so eine Abfrage eben nicht <1 Sek sondern 15 Minuten. Meine User haben es gemerkt, ich dann auch... Beim letzten Mal habe ich um ein Review der SQL-Statements gebeten, aber irgendwie wurde das wohl nicht wirklich priorisiert von meinen Codern verfolgt. Was soll ich denn noch machen? Auf dem Bauch rutschend um Durchführung flehen? Seppuku begehen? Daten löschen damit die Queries wieder im RAM durchgeführt werden können? So, damit wäre ich wieder urlaubsreif, zum entspannen trinke ich gerade ein Glas Cola mit meinem besten Freund Jim Bream. *) ja ja, ich weiß, dass V5+ inzwischen index_merge spricht, aber wirklich toll ist das auch nicht