Fragenfrager
Erfahrenes Mitglied
Und wenn Du schon beim tiefen optimieren bist, hier noch ein paar Ideen:
a) Ich vermute, der CROSS JOIN bei Dir ist überflüssig, Du könntest auch mit einem LEFT OUTER JOIN arbeiten, da Du nur die zip_coordinates einbinden willst, die auch verwendet werden. Genau kann ich das aber nicht sagen, da ich die Tabellen nicht kenne. Intern werden somit weniger Daten angefasst.
https://glossar.hs-augsburg.de/Verbundoperatoren_(Join)
b) Passen alle Datentypen in der DB oder kannst Du ggf. welche verwenden, die weniger Platz verbrauchen, z.B. Tinyint statt int?
https://www.homeconstructor.net/de/mysql-datentypen
c) ComFreek sprach schon den Execution plan an. Damit hängt dann letzendlich auch der Plancache zusammen. Du könnest überlegen, Deine Abfrage als Prepared-Statement (SQL-seitig, nicht php-seitig) zu erstellen. Der Vorteil ist, das Deine Abfrage dann nur einmal im Plancache vorhanden ist und nicht jedesmal als Ad-hoc-Abfrage behandelt wird und somit den Cache vollmüllt. Somit steigt auch die Performance.
d)
SQL Statements werden serverintern in folgender Reihenfolge abgearbeitet:
1) FROM
2) WHERE
3) GROUP BY
4) HAVING
5) SELECT
6) ORDER BY
Daraus ergibt sich: Je weiter ich die "WHERE"-Klausel einschränken kann, desto weniger Datensätze müssen in den nächsten Schritten verarbeitet werden, desto performanter ist die Abfrage. Vielleicht kannst Du Deine Abfrage noch umbauen.
a) Ich vermute, der CROSS JOIN bei Dir ist überflüssig, Du könntest auch mit einem LEFT OUTER JOIN arbeiten, da Du nur die zip_coordinates einbinden willst, die auch verwendet werden. Genau kann ich das aber nicht sagen, da ich die Tabellen nicht kenne. Intern werden somit weniger Daten angefasst.
https://glossar.hs-augsburg.de/Verbundoperatoren_(Join)
b) Passen alle Datentypen in der DB oder kannst Du ggf. welche verwenden, die weniger Platz verbrauchen, z.B. Tinyint statt int?
https://www.homeconstructor.net/de/mysql-datentypen
c) ComFreek sprach schon den Execution plan an. Damit hängt dann letzendlich auch der Plancache zusammen. Du könnest überlegen, Deine Abfrage als Prepared-Statement (SQL-seitig, nicht php-seitig) zu erstellen. Der Vorteil ist, das Deine Abfrage dann nur einmal im Plancache vorhanden ist und nicht jedesmal als Ad-hoc-Abfrage behandelt wird und somit den Cache vollmüllt. Somit steigt auch die Performance.
d)
SQL Statements werden serverintern in folgender Reihenfolge abgearbeitet:
1) FROM
2) WHERE
3) GROUP BY
4) HAVING
5) SELECT
6) ORDER BY
Daraus ergibt sich: Je weiter ich die "WHERE"-Klausel einschränken kann, desto weniger Datensätze müssen in den nächsten Schritten verarbeitet werden, desto performanter ist die Abfrage. Vielleicht kannst Du Deine Abfrage noch umbauen.