Hallo,
ich habe eine Query, die mir eine wunderbare Ergebnismenge produziert, aber ewig lange dauert, wenn die Datenmenge etwas größer ist. Und mit etwas größer meine ich nicht wirklich richtig groß, es reichen schon ein paar 10.000 Einträge der Haupttabelle nebst ähnlich vielen Einträgen der abhängigen Tabellen.
Die Query:
SELECT SQL_CALC_FOUND_ROWS DISTINCT
r.KundenID,
...,
...,
ze.bezahlt,
da.ListenID,
ADDDATE(
r.Rechnungsdatum,
INTERVAL r.Faelligkeit DAY
),
m.Mahnstatus,
ADDDATE(
m.Mahndatum,
INTERVAL m.Faelligkeit DAY
),
UNIX_TIMESTAMP(
ADDDATE(
r.Rechnungsdatum,
INTERVAL r.Faelligkeit DAY
)
),
UNIX_TIMESTAMP(
ADDDATE(
m.Mahndatum,
INTERVAL m.Faelligkeit DAY
)
),
CASE WHEN(r.bezahlt = 1) THEN 'A' WHEN(r.Storno = 1) THEN 'A' WHEN(r.Druck = 0) THEN 'A' ELSE DATEDIFF(
CURDATE(), ADDDATE(
r.Rechnungsdatum,
INTERVAL r.Faelligkeit DAY
))
END,
k.del,
(
SELECT
SUM(ze.Bruttozahlung)
FROM
tableprefix_zahlungseingang ze
WHERE
ze.RechnungenID = r.RechnungenID
) AS BruttoSumme,
rz.GesamtRetoure
FROM
tableprefix_rechnungen r
LEFT JOIN tableprefix_rechnungszuordnung rz ON
r.RechnungenID = rz.RechnungenID
LEFT JOIN tableprefix_zahlungseingang ze ON
r.RechnungenID = ze.RechnungenID
LEFT JOIN tableprefix_datev_belege da ON
da.BelegID = r.RechnungenID
LEFT JOIN tableprefix_berechnungen b ON
r.RechnungenID = b.RechnungenID
LEFT JOIN tableprefix_mahnungen m ON
(
r.RechnungenID = m.RechnungenID AND m.aktiv = 1
) AND m.Mahnstatus =(
SELECT
MAX(tmp.Mahnstatus)
FROM
tableprefix_mahnungen tmp
WHERE
tmp.RechnungenID = r.RechnungenID AND tmp.aktiv = 1
)
LEFT JOIN tableprefix_kunden k ON
r.KundenID = k.KundenID
WHERE
r.Belegart = "RG"
GROUP BY
r.RechnungsNummer
ORDER BY
r.RechnungenID
Ein Explain ergibt:
Leider weiß ich die Auswertung nicht wirklich zu deuten. Die Query benötigt aber 8-10 Sekunden, das ist eindeutig zu lang, da ist also wirklich ein fehlender Index oder Ähnliches die Ursache, scheint mir.
Wäre für hilfreiche Tips dankbar.
Guten Start ins WE, Jörg