Vereinfachung und Beschleunigung einer Mysql Abfrage
Ich suche eine resourcensparende Version der folgenden Abfrage
Hallo Leute,
wieder einaml wende ich mich vertrauensvoll und hilfesuchend an euch!
Ich habe eine Mysql Query, die aus zwei Teilen besteht. Einzeln sind diese Abfragen relativ rasch, in Kombination jedoch sind sie extrem langsam und gehen nahezu an das Zeillimit, von der CPU Auslastung ganz zu schweigen....
Einzelne Queries:
Kann mmir jemand helfen, diese beiden Queries in einer gemeinsamen zu optimieren!?!?
Bisher sieht es bei mir so aus, ist aber extrem langsam...
Wie gesagt, die beiden Teilqueries einzeln gehen rasch, zusammen sind sie elends langsam....
Lg, Chris
Hallo Leute,
wieder einaml wende ich mich vertrauensvoll und hilfesuchend an euch!
Ich habe eine Mysql Query, die aus zwei Teilen besteht. Einzeln sind diese Abfragen relativ rasch, in Kombination jedoch sind sie extrem langsam und gehen nahezu an das Zeillimit, von der CPU Auslastung ganz zu schweigen....
Einzelne Queries:
$inter_q_r2 = "SELECT DISTINCT i.i_id, i.vorname, i.nachname, i.adresse, i.plz, i.ort, i.land, DATE_FORMAT(i.i_erstellt, '%d. %m. %Y') as datum
FROM ".TABLE_INTERESSENTEN." i, ".TABLE_OBJEKT2MAKLER." o2m, ".TABLE_KONTAKTE." k
WHERE o2m.u_id = '".(int)$_SESSION['u_id']."'
AND o2m.chief_agent = '1'
AND k.objekt_id = o2m.o_id
AND i.i_id = k.interessenten_id
AND i.i_system_status = '1'
AND i.i_status = '1'
ORDER BY i.nachname ASC, i.vorname ASC, i.plz ASC ";
$inter_q_r2 = "SELECT DISTINCT i.i_id, i.vorname, i.nachname, i.adresse, i.plz, i.ort, i.land, DATE_FORMAT(i.i_erstellt, '%d. %m. %Y') as datum
FROM ".TABLE_INTERESSENTEN." i
WHERE i.firmen_id = '".(int)$_SESSION['firmen_id']."'
AND i.i_system_status = '1'
AND i.i_status = '1'
ORDER BY i.nachname ASC, i.vorname ASC, i.plz ASC ";
Kann mmir jemand helfen, diese beiden Queries in einer gemeinsamen zu optimieren!?!?
Bisher sieht es bei mir so aus, ist aber extrem langsam...
$inter_q_r2 = "SELECT DISTINCT i.i_id, i.vorname, i.nachname, i.adresse, i.plz, i.ort, i.land, DATE_FORMAT(i.i_erstellt, '%d. %m. %Y') as datum
FROM ".TABLE_INTERESSENTEN." i, ".TABLE_OBJEKT2MAKLER." o2m, ".TABLE_KONTAKTE." k
WHERE o2m.u_id = '".(int)$_SESSION['u_id']."'
AND o2m.chief_agent = '1'
AND k.objekt_id = o2m.o_id
AND i.i_id = k.interessenten_id
OR (i.firmen_id = '".(int)$_SESSION['firmen_id']."')
AND i.i_system_status = '1'
AND i.i_status = '1'
ORDER BY i.nachname ASC, i.vorname ASC, i.plz ASC ";
Wie gesagt, die beiden Teilqueries einzeln gehen rasch, zusammen sind sie elends langsam....
Lg, Chris
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 172023
Url: https://administrator.de/forum/vereinfachung-und-beschleunigung-einer-mysql-abfrage-172023.html
Ausgedruckt am: 26.12.2024 um 22:12 Uhr
8 Kommentare
Neuester Kommentar
SELECT
i.vorname,
i.nachname,
i.adresse,
i.plz,
i.ort,
i.land,
DATE_FORMAT(i.i_erstellt, '%d. %m. %Y') as datum
FROM
".TABLE_KONTAKTE." k
LEFT JOIN ".TABLE_INTERESSENTEN." i ON ( i.i_id = k.interessenten_id )
LEFT JOIN ".TABLE_OBJEKT2MAKLER." o2m ON ( o2m.o_id = k.objekt_id )
WHERE
i.i_system_status = '1' AND
i.i_status = '1' AND (
(
o2m.u_id = '".(int)$_SESSION['u_id']."' AND
o2m.chief_agent = '1'
) OR (
i.firmen_id = '".(int)$_SESSION['firmen_id']."'
)
)
ORDER BY
i.nachname,
i.vorname,
i.plz
;
Index über:
i.i_id
k.interessenten_id
k.objekt_id
o2m.o_id
...ob die Abfrage nun das richtige zurück gibt musst Du testen.
Moin nxclass,
aber ich denke, ein UNION über die zwei (funktionierenden) Queries geht schneller als irgendeine beliebige Query mit "OR".
P.S. Wenn in den bisherigen Queries ein DISTINCT nötig ist, dann ist aber die Struktur marode.
Kommen denn wirklich ohne DISTINCT doppelte Sätze heraus?
Grüße
Biber
aber ich denke, ein UNION über die zwei (funktionierenden) Queries geht schneller als irgendeine beliebige Query mit "OR".
Select x.* from (
SELECT DISTINCT i.i_id, i.vorname, i.nachname, i.adresse, i.plz, i.ort,
i.land, DATE_FORMAT(i.i_erstellt, '%d. %m. %Y') as datum
FROM ".TABLE_INTERESSENTEN." i, ".TABLE_OBJEKT2MAKLER." o2m, ".TABLE_KONTAKTE." k
WHERE o2m.u_id = '".(int)$_SESSION['u_id']."'
AND o2m.chief_agent = '1'
AND k.objekt_id = o2m.o_id
AND i.i_id = k.interessenten_id
AND i.i_system_status = '1'
AND i.i_status = '1'
UNION
SELECT DISTINCT i.i_id, i.vorname, i.nachname, i.adresse, i.plz, i.ort, i.land, DATE_FORMAT(i.i_erstellt, '%d. %m. %Y') as datum
FROM ".TABLE_INTERESSENTEN." i
WHERE i.firmen_id = '".(int)$_SESSION['firmen_id']."'
AND i.i_system_status = '1'
AND i.i_status = '1'
) x
ORDER BY x.nachname ASC, x.vorname ASC, x.plz ASC
P.S. Wenn in den bisherigen Queries ein DISTINCT nötig ist, dann ist aber die Struktur marode.
Kommen denn wirklich ohne DISTINCT doppelte Sätze heraus?
Grüße
Biber
in diesem Fall würde ich aber empfehlen statt 2x
auszuführen, schon vor dem Union die Daten mit diesen WHERE Bedingungen zu reduzieren. Zum Beispiel mit einem View, Unterabfrage oder temp. Tabelle.
Das
ist in dem 2. Teil der Abfrage wohl überflüssig, da i.i_id sicherlich ein eindeutiger Wert ist !?
AND i.i_system_status = '1'
AND i.i_status = '1'
Das
DISTINCT i.i_id
Moin nxclass,
ist natürlich alles Spekulation.
Wenn in der WHERE-Bedingung beispielsweise eine Zeitraum-Einschränkung stünde ("nur die Sätze vom 1.7.2011 bis 31.7.2011")...
--> dann würde ich von einer wesentlichen Reduzierung aller Sätze ausgehen.
Bei Feldern, die den Verlegenheitsnamen "status" und "system_status" haben, gehe ich durch leidvolle Erfahrung eher davon aus, dass 98% aller Sätze durch diese Maschen schlüpfen.
Ist aber nur ein Verdacht.
Mit der 2.Distinct-Bedingung hast du aber sicherlich Recht.
Das zweite DISTINCT kann in meinem UNION rausfliegen, unabhängig davon kann auch aus dem UNION ein UNION ALL werden.
Dann spare ich noch einen zeitaufwändigen SORT-Vorgang und bin erst recht schneller als du
Grüße
Biber
ist natürlich alles Spekulation.
Wenn in der WHERE-Bedingung beispielsweise eine Zeitraum-Einschränkung stünde ("nur die Sätze vom 1.7.2011 bis 31.7.2011")...
--> dann würde ich von einer wesentlichen Reduzierung aller Sätze ausgehen.
Bei Feldern, die den Verlegenheitsnamen "status" und "system_status" haben, gehe ich durch leidvolle Erfahrung eher davon aus, dass 98% aller Sätze durch diese Maschen schlüpfen.
Ist aber nur ein Verdacht.
Mit der 2.Distinct-Bedingung hast du aber sicherlich Recht.
Das zweite DISTINCT kann in meinem UNION rausfliegen, unabhängig davon kann auch aus dem UNION ein UNION ALL werden.
Dann spare ich noch einen zeitaufwändigen SORT-Vorgang und bin erst recht schneller als du
Grüße
Biber