2017-02-21 2 views
0

Ich habe viele genau die gleichen Tabellen. TableA, TableB, TableC, TableD usw., aus denen ich Ansichten erstellen möchte. Doing select * from TableA dauert 20ms, macht select * from tableB dauert 20ms, aber (select * from TableA) union all (select * from TableB) dauert über 20 Minuten. Diese Tabellen haben genau die gleichen Spalten. Gibt es Einstellungen in my.cnf, die ich ändern muss, oder eine Möglichkeit, eine Ansicht zu erstellen, die schneller ausgeführt wird? Alle Tabellen haben Reihen von 1,5 m bis etwa 10 m.Kann UNION ALL schneller ausgeführt werden?

Ergebnisse erklären

PRIMARY TableA ALL     28808685  
UNION TableB ALL     15316215  
UNION RESULT <union1,2> ALL  Using temporary 

Tabellenstruktur: 10 VARCHAR (20) 's, 5 unsigned INTs.

+0

'BESCHREIBEN' und' EXPLAIN', bitte. – bishop

+0

Wenn Ihre Tabelle A über 1,5 Millionen Zeilen verfügt, können nicht nur 20ms alle Zeilen zurückgeben. Wenn Sie irgendwo zwischen 5M und 40M Zeilen zurücksenden, wird es eine Menge Zeit benötigen - es gibt vielleicht andere Dinge, die Sie optimieren können, wie die Methode der Datenwiederherstellung (mit einem Cursor, vs alles im Speicher usw .). – nos

Antwort

1

Meine Schätzung ist, dass select * from TableA dauert nicht 20 ms. Es dauert 20 ms, um mit der Rückgabe der Ergebnisse zu beginnen.

Obwohl ich Ihre Frage beantworten werde, sollten Sie Ihre Datenstruktur erneut besuchen. Mehrere Tabellen mit demselben Layout zu haben, ist normalerweise eine sehr schlechte Idee. Stattdessen sollten Sie eine einzelne Tabelle mit allen Zeilen haben.

Aber Sie scheinen das nicht zu haben.

Versuchen Sie, die union all ohne Klammern ausgeführt wird:

select * from TableA union all 
select * from TableB; 

MySQL eine Gewohnheit zu materialisieren Subqueries hat. Ich bin mir nicht sicher, ob es dies mit union all Unterabfragen tut, aber angesichts Ihrer Beschreibung des Problems, sieht das wahrscheinlich.

+0

Wenn ich eine einzelne Tabelle mit allen Zeilen habe, werde ich 250 + m Zeilen haben und wachsen. Der Unterschied zwischen den Daten von tableA und tableB besteht darin, dass Tabelle A nur Daten für ClientA und Tabelle B Daten nur für ClientB enthält. Das proprietäre Tool, in das Daten eingegeben werden, wählt * aus der Tabelle aus und verarbeitet dann Daten und verwirft nutzlose Daten. Wenn wir es auf den einen massiven Tisch richten, wird es aus dem Speicher auslaufen und alle möglichen dummen Dinge tun. – Dimi

+0

Das Problem herausgefunden. Es war die Zeit bis zum ersten Byte (oder die Äquivalenz davon in mysql), die den Timeout der Verbindung verursachte. Union ALL hat zuerst diese Tabelle auf dem Server generiert und dann gesendet. Vielen Dank. – Dimi