Ich habe ein System, das Daten von Produktionsreports (CSV-Dateien) sammelt und sie in eine mySql DB legt. Ich habe eine Header-Tabelle, die die Produktionsdaten des sequentiellen Berichts mit der gleichen Einstellung enthalten, und eine Tabelle mit den einzelnen Berichten, die mit dem ersten verbunden sind (trfCamRep.hdrId -> trfCamHdr.id).Verlangsamen mySql-Update mit Join
Ich habe eine Abfrage, um den Gesamtbericht, den Dubt und die fehlerhaften und die maxTs zu berechnen. Diese Daten werden im Visualizer verwendet.
Die Abfrage ist zu langsam, es dauert 9 Sekunden. Können Sie mir helfen, es zu beschleunigen?
SET @maxId:=(SELECT MAX(id) FROM trfCamHdr WHERE srcCod='7');
UPDATE trfCamHdr AS hdr
LEFT JOIN (SELECT hdrF.id,COUNT(*) AS nTot,
SUM(IF(res=1,1,0)) AS nWrn,SUM(IF(res=2,1,0)) AS nKO,
MAX(ts) AS maxTS
FROM trfCamHdr AS hdrF
JOIN trfCamRep AS repF ON repF.hdrId=hdrF.id
WHERE clcEnd=0 AND srcCod='7'
GROUP BY hdrF.id) AS valT ON valT.id=hdr.id
SET hdr.clcEnd=IF(hdr.id<@maxId,1,0),
hdr.nTot=valT.nTot,
hdr.nWrn=valT.nWrn,
hdr.nKO=valT.nKO,
hdr.maxTS=valT.maxTS
WHERE hdr.id>=0 AND hdr.clcEnd=0 AND hdr.srcCod='7';
Hinweis trfCamHdr hat folgende Spalten:
- id (Primärschlüssel)
- clcEnd: flag von End-Berechnung (die letzte, weil in Fortschritte auf 0 bleiben)
- Ntot: Elemente mit diese Überschrift
- nWrn: Elemente mit Res = 1
- nKO: Elemente mit Res = 2
- maxTs: TS des letzten Elements
trfCamRep hat folgende Spalten:
- hdrId (siehe id von trfCamHdr)
- res: 0 gut, 1 Sicherlich gehören, 2 Störung
- ts: Bericht Zeitstempel
Vielen Dank für die Antwort.Das if wird benötigt, um auch die letzte Zeile zu aktualisieren. – user3227849
Ich möchte, dass sie die letzte Zeile sehen können, die in Echtzeit aktualisiert wird, wenn ein neuer Bericht erstellt wird. – user3227849