2016-06-22 14 views
0

zu erhalten Ich habe etwa 20 Tabellen. Diese Tabellen haben nur ID (Primärschlüssel) und Beschreibung (Varchar). Die Daten reichen für ungefähr 400 Zeilen für eine Tabelle.Bessere Möglichkeit, 15 Tabellenergebnisse in MySql

Im Moment muss ich Daten von mindestens 15 Tabellen gleichzeitig bekommen. Jetzt rufe ich sie nacheinander an. Was bedeutet, dass ich in einer Sitzung 15 Anrufe gebe. Dies macht meinen Prozess langsam.

Kann jemand einen besseren Weg vorschlagen, um die Ergebnisse aus der Datenbank zu erhalten?

Ich verwende MySQL database und Java Springs auf Serverseite verwenden. Wird die Aussicht für alle kombiniert mir helfen? Die Anwendung wird langsam wegen dieses Problems und ich brauche eine Lösung, die meinen Prozess schneller machen wird.

+1

400 Zeilen - wow -.. besser nennen NASA Aber wirklich brauchen Sie mehr infor hier liefern Vielleicht könnten Sie machen, was Macht diese 15 Anrufe immer eine asynchrone Art und Weise? – AntDC

+1

Ich glaube, du verpasst das Bild. 400 Zeilen für den Tisch, es ist wie 1 Penny in der Tasche - nichts für MySQL, also 15 Anrufe von nichts sollten fast keine Zeit brauchen. Also, wie nennt man langsam? Hast du irgendwelche Beweise? Kannst du dein Real-Db-Schema angeben? Abfrage Proben? sqlfiddle wäre sehr hilfreich. Wie verfolgen Sie die Leistung? – Alex

+0

https://www.youtube.com/watch?v=l91ISfcuzDw – Strawberry

Antwort

0

Es klingt wie Ihr Schema ist nicht so groß. 20 Tabellen von id/varchar klingen wie ein gebrochener EAV, der allgemein als gebrochen betrachtet wird. Trotzdem denke ich, dass eine UNION-Abfrage helfen wird. Dies wäre die "Ansicht" in der Datenbank zu erstellen, so dass Sie nur SELECT * FROM thisviewyoumade und lassen Sie es sich sorgen für das Treffen aller Tabellen.

Eine UNION-Abfrage funktioniert, indem mehrere SELECT Statataements "übereinander" gestapelt werden. Es ist wichtig, dass jede Anweisung SELECT die gleiche Anzahl, die gleiche Ordinalzahl und die gleichen Typen von Feldern aufweist. Wenn sie also die Ergebnisse stapelt, stimmt alles überein.

In Ihrem Fall ist es sinnvoll, ein zusätzliches Feld zu erstellen, damit Sie wissen, aus welcher Tabelle es stammt. Etwas wie folgt aus:

SELECT 'table1' as tablename, id, col2 FROM table1 
UNION ALL 
SELECT 'table2', id, col2 FROM table2 
UNION ALL 
SELECT 'table3', id, col2 FROM table3 
... and on and on 

Die Namen oder Aliasnamen der Felder in der ersten SELECT Aussage sind die Feldnamen, die in der Ergebnismenge verwendet werden, die zurückgegeben wird, also keine Sorgen über ein Bündel AS blahblahblah in nachfolgenden SELECT tun Aussagen.

Die eigentliche Frage ist, ob diese Union-Abfrage schneller als 15 einzelne Anrufe auf solch eine winzige winzige Menge von Daten ausführen wird. Ich denke, die bessere Option wäre, Ihr Schema zu ändern, so dass dieses Zeug bereits in einer Tabelle gespeichert ist, genau wie diese Ausgabe der UNION-Abfrage. Dann würden Sie eine einzelne SELECT-Anweisung für eine einzelne Tabelle benötigen. Und 400x20 = 8000 ist immer noch ein dinkeliger kleiner Tisch zum Abfragen.

0

Um eine Zeile aller Beschreibungen in App-Code in einem einzigen Roundtrip senden eine Anfrage Art

select t1.description, ... t15.description 
from t -- this should contain all needed ids 
join table1 t1 on t1.id = t.t1id 
... 
join table1 t15 on t15.id = t.t15id 
0

ich nicht bekommen Sie bekommen, was Sie wirklich brauchen, aber hier alle diese Tabellenwerte in einzelne Tabelle verschmelzenden CREATE TABELLE table_name AS (

SELECT * 
    FROM table1 t1 
    LEFT JOIN table2 t2 ON t1.ID=t2.ID AND 
    ... 
    LEFT JOIN tableN tN ON tN-1.ID=tN.ID 

) 
Verwandte Themen