Frage

Ich habe eine Tabelle der Form

CREATE TABLE data
{
   pk INT PRIMARY KEY AUTO_INCREMENT,
   dt BLOB
};

Es hat etwa 160.000 Zeilen und über 2 GB Daten in der BLOB-Spalte (durchschnittl. 14kb pro blob). Eine weitere Tabelle hat Fremdschlüssel in dieser Tabelle.

So etwas wie 3000 der Kleckse sind identisch. Also, was ich will, ist eine Abfrage, die mir eine Re-Map-Tabelle geben, der mir erlaubt, um die Duplikate zu entfernen.

Der naive Ansatz dauerte etwa eine Stunde auf 30-40k Zeilen:

SELECT a.pk, MIN(b.pk) 
    FROM data AS a 
    JOIN data AS b
  ON a.dt=b.dt
  WHERE b.pk < a.pk
  GROUP BY a.pk;

Ich bin zufällig haben, aus anderen Gründen eine Tabelle, die die Größe des Blobs hat:

CREATE TABLE sizes
(
   fk INT,  // note: non-unique
   sz INT
   // other cols
);

Durch die Indizes bauen sowohl für fk und eine andere für sz die direkte Abfrage von dem dauert etwa 24 Sekunden mit 50k Zeilen:

SELECT da.pk,MIN(db.pk) 
  FROM data AS da
  JOIN data AS db
  JOIN sizes AS sa
  JOIN sizes AS sb
  ON
        sa.size=sb.size
    AND da.pk=sa.fk
    AND db.pk=sb.fk
  WHERE
        sb.fk<sa.fk
    AND da.dt=db.dt 
  GROUP BY da.pk;

Allerdings, die eine vollständige Tabelle Scan da (die Datentabelle) tut. Da die Trefferquote recht niedrig sein sollte, würde ich denken, dass ein Index-Scan besser wäre. In diesem Sinne in der Nachspiel eine dritte Kopie der Daten als 5. verbinden, das zu bekommen, und verlor etwa 3 sec.

OK so für die Frage:? Bin ich gehe viel besser erhalten als die zweite Option Wenn ja, wie

Ein bisschen logische Folge ist: Wenn ich eine Tabelle, wo die Verwendung des Schlüsselspalte sehr schwer bekommen, aber der Rest nur noch selten gewöhnen sollte, werde ich immer besser dran Hinzufügen eines weiteren dieser Tabelle beitreten einen Index-Scan zu fördern vs . eine vollständige Tabelle scannen?


Xgc auf #mysql@irc.freenode.net weist darauf hin, dass das Hinzufügen eines Ablagetisches wie Größen, aber mit einer einzigartigen Einschränkung auf fk viel helfen könnte. Einiger Spaß mit Trigger und was nicht kann es nicht schlecht machen, auch auf dem neuesten Stand zu halten.

War es hilfreich?

Lösung

Sie können jederzeit eine Hash-Funktion verwenden ( MD5 oder SHA1 ) für Ihre Daten und dann die Hashes vergleichen.

Die Frage ist, ob Sie die Hashes in Ihrer Datenbank speichern kann?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top