Ich habe ein Problem mit der folgenden Abfrage. Es wählt Protokolldatensätze aus einer Datenbanktabelle aus.Sehr langsame MySQL-Abfrage (20 bis 60 Sekunden!) - warum?
SELECT paymentslog.*, user.username, user.usergroupid, user.displaygroupid,
purchase_temp.threadid
FROM " . TABLE_PREFIX . "paymentslog AS paymentslog
LEFT JOIN " . TABLE_PREFIX . "user AS user
ON (paymentslog.userid = user.userid)
LEFT JOIN " . TABLE_PREFIX . "paymenttransaction AS paymenttransaction
ON (paymentslog.transactionid = paymenttransaction.transactionid)
LEFT JOIN " . TABLE_PREFIX . "paymentinfo AS paymentinfo
ON (paymenttransaction.paymentinfoid = paymentinfo.paymentinfoid)
LEFT JOIN " . TABLE_PREFIX . "purchase_temp AS purchase_temp
ON (paymentinfo.hash = purchase_temp.hash) $filterlogs_where
GROUP BY paymentslog.logid
ORDER BY paymentslog.dateline DESC
LIMIT $startat, $perpage
- alle Joins benötigt threadid mit Ausnahme der mit Benutzertabelle verbinden auf SELECT für den Zugriff auf Benutzernamen für den Zugriff auf usergroupid und displaygroupid
- es wurde 20 Sekunden benötigt, um zu laufen (!), Und während meiner try um es zu beheben, nach dem Hinzufügen von INDEX für Spalte transactionid (der Tabelle Paymentslog), jetzt braucht es ... 60 Sekunden!
- aus irgendeinem Grund war es eine bestimmte Zeile mehrere Male zurückkehren, und aus diesem Grund Ich reparierte sie durch eine „GROUP BY paymentslog.logid“
ich feststellen, dass muss hinzufügen:
- $ filterlogs_where PHP-Variable hat das WHERE der Abfrage (ich baue über PHP verschiedene Filter für das Paymentslog). $ filterlogs_where hat standardmäßig einen Wert von "1 = 1", und wenn ich einen Filter anwenden muss, füge ich ein. = "AND paymentslog.userid = X" usw.
Jede Idee, warum diese Abfrage ist so langsam?
Ich glaube, ich habe kompliziertere Abfragen gesehen und geschrieben, die in ein paar Sekunden oder Millisekunden ablaufen. Warum dieses Problem mit der obigen Abfrage?
Während Beitritt auf Hash ist möglich, nur auf Integers Beitritt sollte viel schneller sein. Über wie viele Daten sprechen wir, Sie haben es versäumt, uns das zu sagen. – Xorifelse
Joining auf Ganzzahlen kann teilweise schneller sein, aber das ist alles. Es ist unmöglich, mit diesem Problem ohne CREATE TABLE-Anweisungen für alle relevanten Tabellen und ein EXPLAIN für die obige Abfrage zu helfen. – Strawberry
@Xorifelse - Es gibt keinen 'HASH'-Index. Wie auch immer, Hash ist nur geringfügig schneller als BTree. –