Jörg: Flaschenhals bei Query finden (mysql(i))

Beitrag lesen

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