Hallo,
ich stehe gerade vor einem komplizierten Problem. Ich suche die Ausreißer in einer MySQL-Tabelle (ENGINE=MEMORY). Ein funktionierendes Statement dafür habe ich schon:
Die Memory-Tabelle könnte so aussehen:
Das Statement oben läuft bei einer Tabelle mit 10.000 Zeilen in wenigen Sekunden durch. Bei einer Tabelle mit 100.000 lädt er schon rund 10 Minuten. Die Memory Tabelle hat mehrere Millionen Zeilen.
Das Statement oben zählt in einem Join die zugehörigen Treffer zu jedem Preis. Das ist ein unglaublicher Rechenprozess. Ich brauche eine Variante, wo er gezielt nur die nimmt, die keine Treffer haben. Die Anzahl der nicht validen Preise beläuft sich auf unter 1% der Daten, deswegen sollten die überschüssigen 99% mit einer geschickten Bedingung verworfen werden.
Gruß, Tommy
EDIT:
Durch eine kleine Änderung braucht er bei 100.000 Datensätzen nur noch 5 Minuten.
Das ist aber leider immer noch viel zu langsam. Hat Jemand eine Idee, wie man da noch mehr rausholen kann?
ich stehe gerade vor einem komplizierten Problem. Ich suche die Ausreißer in einer MySQL-Tabelle (ENGINE=MEMORY). Ein funktionierendes Statement dafür habe ich schon:
SQL:
UPDATE
tmp_item_prices
SET valid = 0
WHERE id IN
(SELECT
id
FROM
(SELECT
tip1.id,
COUNT(tip2.price) AS amount
FROM
tmp_item_prices tip1
LEFT OUTER JOIN
tmp_item_prices tip2
ON
tip2.item_id = tip1.item_id
AND
tip2.id >= tip1.id-5 AND tip2.id != tip1.id AND tip2.id <= tip1.id+5
AND
tip2.price > tip1.price*0.8 AND tip2.price < tip1.price*1.2
GROUP BY
tip1.id) subq1
WHERE
amount = 0);
Die Memory-Tabelle könnte so aussehen:
Code:
ID ITEM_ID PRICE
1 1 120
2 1 90
3 1 135
4 1 144
5 1 124
6 2 645
7 2 660
8 2 610
9 2 550
Das Statement oben läuft bei einer Tabelle mit 10.000 Zeilen in wenigen Sekunden durch. Bei einer Tabelle mit 100.000 lädt er schon rund 10 Minuten. Die Memory Tabelle hat mehrere Millionen Zeilen.
Das Statement oben zählt in einem Join die zugehörigen Treffer zu jedem Preis. Das ist ein unglaublicher Rechenprozess. Ich brauche eine Variante, wo er gezielt nur die nimmt, die keine Treffer haben. Die Anzahl der nicht validen Preise beläuft sich auf unter 1% der Daten, deswegen sollten die überschüssigen 99% mit einer geschickten Bedingung verworfen werden.
Gruß, Tommy
EDIT:
Durch eine kleine Änderung braucht er bei 100.000 Datensätzen nur noch 5 Minuten.
Das ist aber leider immer noch viel zu langsam. Hat Jemand eine Idee, wie man da noch mehr rausholen kann?
SQL:
UPDATE
tmp_item_prices
SET valid = 0
WHERE id IN
(SELECT
id
FROM
(SELECT
tip1.id
FROM
tmp_item_prices tip1
LEFT OUTER JOIN
tmp_item_prices tip2
ON
tip2.item_id = tip1.item_id
AND
tip2.id >= tip1.id-5 AND tip2.id != tip1.id AND tip2.id <= tip1.id+5
AND
tip2.price > tip1.price*0.8 AND tip2.price < tip1.price*1.2
WHERE
tip2.id IS NULL) subq1); -- Diese WHERE Abfrage erspart mir den COUNT und verwirft somit die validen Ergebnisse
Zuletzt bearbeitet von einem Moderator: