2016-04-09 10 views
0

Ich habe einen relativ teuren Prozess, der eine "Self Join" erfordert, die meine Rechenzeit verstopft. Betrachten Sie das folgende Skript:MySQL effiziente Tabelle Verdoppelung

CREATE TEMPORARY TABLE tempdb.table1 
SELECT * FROM db.sometable WHERE {condition}; 
ALTER TABLE tempdb.table1 ADD INDEX idx_t({columns for join}); 

CREATE TEMPORARY TABLE tempdb.table2 
SELECT * FROM tempdb.table1; 
ALTER TABLE tempdb.table2 ADD INDEX idx_t({columns for join}); 

In diesem Fall habe ich nötig bin der Index zweimal zu berechnen, bevor ich die Verbindung kann versuchen. Wenn ich die zweite Tabelle mit dem Operator 'LIKE' erstelle, wird die neue Tabelle mit der Indexstruktur erstellt, sie muss jedoch noch verarbeitet werden, während die Tabelle gefüllt wird.

Gibt es eine Möglichkeit, die Tabelle, Indizes und alles in einem Schritt vollständig zu duplizieren? Es würde die Berechnungszeit erheblich einschränken, da es nur Speicher für diese neue Tabelle finden müsste, anstatt viel Rechenleistung zu replizieren. Wie in den Kommentaren erwähnt, ist dies ein Problem, auf das ich regelmäßig für verschiedene Anwendungen stoße. Mein Ziel bei dieser Frage ist nicht die Optimierung einer bestimmten Anwendung, sondern Informationen zu diesem Thema im Allgemeinen.

+1

Es ist möglich, dass Sie die ursprüngliche Abfrage ohne temporäre Tabellen optimieren können. Sie sollten eine andere Frage stellen und die Abfrage einschließen, die Sie optimieren möchten. –

+0

@GordonLinoff Dies ist ein Problem, auf das ich oft stoße, unabhängig vom genauen Kontext. Daher interessiert mich diese Frage mehr als einige allgemeine Optimierungsansätze. – jameselmore

+0

@jameselmore. . . Interessant. Ich muss fast nie temporäre Tabellen erstellen, um Abfragen zu optimieren. –

Antwort

0

Erstellen Sie die Tabelle wie oben erwähnt mit dem Operator 'LIKE'. Deaktivieren Sie dann die Indizes, bevor Sie die Daten aus der Quellentabelle kopieren. Etwas wie folgt aus:

CREATE TABLE destdb.table1 LIKE srcdb.table1; 
ALTER TABLE destdb.table1 DISABLE KEYS; 
INSERT INTO destdb.table1 SELECT * FROM srcdb.table1; 
ALTER TABLE destdb.table1 ENABLE KEYS; 
+0

Wenn ich die Schlüssel wieder aktivieren kann, wird es nicht noch alles neu verarbeiten müssen? Nicht klar, dass dies das Problem so gut löst, wie es in zwei verschiedene Schritte zerlegt wird. – jameselmore

+0

Erneutes Aktivieren des Index erstellt die Indexdaten. Sie können das nicht vermeiden, aber indem Sie den Index vor dem Einfügen deaktivieren, erhalten Sie eine bessere Leistung. Die Einfügung wird schneller sein, da der Index nicht für jede Einfügung aktualisiert werden muss. Wenn Ihre Tabelle Fremdschlüssel hat, können Sie auch Fremdschlüssel deaktivieren und eine bessere Leistung erzielen. – gmarintes

+0

Ok, aber wie unterscheidet sich das von dem, was ich oben geschrieben habe? Wo schreibe ich in eine zweite Tabelle und dann die Indizes – jameselmore