Brauche die Datensätze, die beim Join keine Treffer haben

Ich sehe gerade ein Problem bei deinem Statement.

Wenn ein Preis mal total aus der Reihe springt, weil er einfach 100 mal größer ist als die umliegenden Preise, würden bei deinem Statement alle umliegenden Preise invalide sein.
 
Kann es zufällig sein, dass MySQL irgendwie Daten zusätzlich cached. Ich mache bei jedem Durchlauf ein Truncate auf die Tabelle und nehme 100.000 Datensätze. Normale Ergebnisse lagen immer im Minuten Bereich. Auf einmal kriege ich hier ein Ergebnis mit 4 Sekunden, was ich aber vorher schon getestet hatte und bei rund 5 Minuten lag!?
 
Immer die gleichen Datensätze?

Und mein Index ist ein anderer als derjenige, den du gepostet hast.

Schau dir mal den Explain-Plan vom SQL an.
 
Und setze einen Index auf id + item_id

ID ist doch ein Primary. Bringt das was, da ein Index mit ITEM_ID drauf zu setzen? Ich teste das gleich mal...


Immer die gleichen Datensätze?

Ja, müsste so sein. Mache beim Import einfach ein LIMIT 100000


EDIT:
Also es findet ein Truncate auf die Tabelle statt und dann werden die Daten aus anderen Tabellen geholt und da rein geschoben. Da gehe ich hin und hole dann nur 10.000 oder 100.000 oder so...


EDIT2:
Der neue Index hat keinen Vorteil gebracht. :(
 
Zuletzt bearbeitet:
Also die aktuelle Variante benötigt nur noch knapp 50 Minuten. Die alte Variante hatte 90 Minuten gebraucht. Das ist soweit schon mal okay.

Noch vllt zwei kurze Fragen:

1. Was ist besser?
Die ITEMs in einer foreach Schleife zu prüfen, was die Tabelle immer nur kurz locken würden oder ein komplette Überprüfung, was die Tabelle glaube ich auch über die komplette Dauer blockiert. Die Memory-Tabelle dient nur als Zwischentabelle. Da finden eigentlich keine anderen Prozesse statt.

2. Was ist performanter, wenn ich in einer foreach Schleife einzelne ITEM_IDs prüfe?
Einen direkten JOIN über die ganze Tabelle machen und im ON mit der ITEM_ID verknüpfen oder den JOIN auf eine Subquery setzen, die die gesuchte ITEM_ID vorselektiert.
 
So, in einer foreach Schleife wird jede ITEM_ID geprüft mittels Script und einfacher if-Abfrage. Die nicht validen Preise werden mittels UPDATE auf nicht valide gesetzt. Der Spaß dauert, warum auch immer, nur eine Minute. Das Ergebnis sieht korrekt aus und der Query-Cache ist deaktiviert. Es ist mir ein absolutes Rätsel, da vor zwei Tagen diese Variante mit 90 Minuten mich zum Optimieren getrieben hat. In den zwei Tagen ist nicht viel passiert, bis auf der Indice, der da zu gekommen ist.

Wie auch immer. Die Lösung ist super. Und danke für die Hilfe.

Gruß, Tommy
 
Zurück