Sven Rautenberg: MySQL Lösung JOIN/Subselect <==> PHP Version

Beitrag lesen

Moin!

Immer wieder liest man hier im Forum, dass man besser direkte MySQL Abfragen machen soll anstatt es über PHP zu lösen.

Das ist im Grundsatz erstmal richtig, denn das ist die sauberere Lösung, die keine Vorab-Optimierung vornimmt.

Nun hast du allerdings jetzt eine konkrete SQL-Abfrage, deren Performance zu wünschen übrig läßt. Deinem Query sieht man als informierter Interessent an, dass sie deshalb langsam wird, weil nahezu keinerlei Indexoperationen genutzt werden können. Das liegt vor allem an der intensiven Nutzung der Funktion SUBSTRING() und dem Subselect. MySQL muss hier also richtig viel arbeiten, mit Full-Table-Scans etc.

Der Ausweg aus so einer Situation besteht in der Tat aus zwei Alternativen: Entweder man optimiert die Datenbank (indem bessere Indices gesetzt werden, evtl. redundante Felder erzeugt werden, die vorberechnet das Funktionsergebnis enthalten, und der Query optimiert wird durch Untersuchung des Ausführungsplans mittels EXPLAIN), oder man splittet die Querys an exakt der Stelle auf, die bei der Abfrage zu umfangreichen Kreuztabellenoperationen führt, und gewinnt durch Aufspaltung der Abfrage in eine erste, sehr stark vorfilternde Abfrage mit relativ wenig Datensätzen plus eine zweite Abfrage oder Abfragenserie, die diese wenigen Datensätze indexbasiert schnell auslesen kann, mehr Zeit, als man mit einer "sauberen", den Lehrmethoden entsprechenden Query verbrät.

- Sven Rautenberg