Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

MySQL - Einfache Select -Join Abfrage dauert ewig

Frage Entwicklung Datenbanken

Mitglied: knut4linux

knut4linux (Level 1) - Jetzt verbinden

24.07.2012 um 11:14 Uhr, 4154 Aufrufe, 6 Kommentare

Beim verbinden mehrerer Tabellen in einer Select-Abfrage wird das Ergebnis nach knapp einer Minute geliefert, der slow_query_counter zählt dabei natürlich hoch.

Hi @all,

wie ich bereits beschrieben habe, verwende ich ein einfache Abfrage welche Tabellen verbinden soll. Hier mal die Strucktur.

Artikel
Index <- Primary; Autoimcrement
ImportId <- Indexkey = Index über Spalte
Artikelgruppe
Vaterartikelgruppe
Basisartikelgruppe
Bild1
Bild2
Bild3
usw

101010_Abmessungen
Index <- Primary; Autoincrement
ImportId <- Unique
a
b
c
d
usw


101010_TechnischeDaten
Index <- Primary, Autoincrement
ImportId <- Unique
Cr
C0r
Gewicht
usw.




In der Tabelle Artikel erfasse ich lediglich Artikelgrunddaten wie Bilder zum Artikel, Artikelgruppen etc. Jede Artikelgruppe enthält einen bestimmten Artikeltyp wie zum Beispiel "Kettenrad" der sich von anderen Artikeln unterscheidet, daher auch die Tabellen 101010_Abmessungen (für die Abmessungen des Artikels) und 101010_TechnischeDaten (für Infos wie Bruchlast, Tragzahlen, Gewicht etc). Die Zahlen im Tabellenkopf stehen also immer für die Basisartikelgruppe des jeweiligen Artikels.


Über eine Abfrage Verbinde ich die Tabellen (je nach dem was für ein Artikeltyp ich benötige) und generiere mir eine Tabelle. Die Abfrage funktioniert bis dahin einwandfrei und auch sehr zügig.

SELECT *
FROM Artikel AS t1
INNER JOIN 101010_Abmessungen AS t2 ON ( t1.ImportID = t2.ImportID )
INNER JOIN 101010_TechnischeDaten AS t3 ON ( t1.ImportID = t3.ImportID )
WHERE t1.ImportId like 'IRGENDWAS'


Wie in der Abfrage zu sehen ist, verbinde ich meine Tabellen nicht über den Primary_Key "Index" sondern über die Spalte ImportId, weil diese Quasi "Eineindeutig" ist. Mit anderen Worten, meine Tabelle Artikel enthält 24.000 Datensätze (Tendenz steigend weil ich noch nicht alle Erfasst habe), während je nach Artikel die Tabelle XXX_Abmessungen nur 100 oder 2 Tausend oder X-Datensätze enthält.

Nun zum Problem:
Da ich meine Tabellen nicht über den Primary_Key verbinde sondern über die ImportId möchte ich in der Tabelle "Artikel" über die Spalte "ImportId" den Indextyp UNIQUE anlegen, damit die Tabelle nicht bei jeder Abfrage squentiel gelesen werden muss. Sobald ich aber für diese Spalte den Typ UNIQUE festlege dauert die Abfrage wie sie oben geschrieben ist auf einmal fast eine Minute.

Analyse der Tabellen sowie optimieren beschleunigen diese Abfrage nicht. Ich erhalte lediglich die Info, dass die Tabellen in Ordnung sind.

Meine Frage an euch: Warum zickt der Server so rum wenn ich in der Tabelle "Artikel" UNIQUE für die ImportId festlege, die anderen Tabellen (Abmessungen, TechnischeDaten etc) haben doch auch den UNIQUE über die Spalte ImportId. Wenn ich den UNIQUE über der Spalte Artikel.ImportId "drop" und einen einfachen Index anlege, funktioniert die Abfrage wieder einwandfrei. Ich bin etwas verwundert darüber und dankbar für jeden Tipp.

Ich entschuldige mich im Voraus schon mal für diesen Roman und danke für eure Hilfe.
Mitglied: nxclass
24.07.2012, aktualisiert um 12:34 Uhr
Datantyp bzw Länge von 'ImportId' ?

Frage:
Wenn 'ImportId' schon UNIQUE ist - wozu dann noch 'Index' als PK mit AI definieren ? ... 'ImportId' könnte doch dann gleich als PK genommen werden !? ... wenn dem so ist, dann könnten ja auch die Tabellen '101010_Abmessungen' und '101010_TechnischeDaten' zusammen gefasst werden ?

EDIT
Frage:
Geht die Abfrage evtl deutlich schneller wenn Du nur die Keys SELECTierst ?
Bitte warten ..
Mitglied: knut4linux
24.07.2012, aktualisiert um 13:11 Uhr
@nxclass
Wenn 'ImportId' schon UNIQUE ist - wozu dann noch 'Index' als PK mit AI definieren ?

stimmt eigentlich, dass werde ich gleich mal so umbauen...

wenn dem so ist, dann könnten ja auch die Tabellen '101010_Abmessungen' und '101010_TechnischeDaten' zusammen gefasst werden ?

An sich wäre das kein Problem. Es geht mir persönlich aber um eine "Ordnung" weil ich die Tabelle "TechnischeDaten" immer erst dann brauche, wenn ein Kunde wirklich das technische Datenblatt zu einem Produkt benötigt. Damit verfolge ich das Ziel den DB-Traffic so schmal wie möglich zu halten, weil ich alle Tabellen erst in der "ich sage mal salop... dritten Ebene benötige". Die Daten also schon mit abzufragen obwohl sie nicht gebraucht werden ist aus meiner Sicht nicht so Ressourcenschonend, gerade bei der Produktvielfalt.

Aber ich danke dir für deinen Tipp und werd das gleich mal umsetzen. Meld mich gleich wieder

Edit

Datentyp von ImportId ist varChar(50)
Bitte warten ..
Mitglied: nxclass
24.07.2012 um 13:42 Uhr
Datentyp von ImportId ist varChar(50)
evtl ist das einfach zu viel - es gibt die Möglichkeit eine weitere Tabelle anzulegen:
import_keys mit den Feldern id (INT PK + AI) und importid (varchar50 UK)

Dann könntest Du mit einem simplen INT statt mit einem CHAR(50) die Tabellen verbinden und hast trotzdem die Möglichkeit noch auf die "orginal" importId zurück zu greifen.
Bitte warten ..
Mitglied: knut4linux
24.07.2012 um 14:10 Uhr
Danke für deine Tipps. Ich habe mal die Lösung probiert welche du vorgeschlagen hast, allerdings mit geringem erfolg.

Die Abfrage bringt das Ergbenis nach 14.0462 sek. Hin und her probiert und eigentlich aus Spaß einfach mal den Ausgangspunkt meiner Abfrage geändert.

Alte Abfrage:

SELECT *
FROM Artikel AS t1
INNER JOIN 301011_Abmessungen AS t2 ON ( t1.ImportID = t2.ImportID )
INNER JOIN 301011_TechnischeDaten AS t3 ON ( t1.ImportID = t3.ImportID )
INNER JOIN 301011_Zubehoer AS t4 ON ( t1.ImportID = t4.ImportID )
WHERE t1.ImportId like '%KRS32%'

Ergebnis: 14.0462 sek (94 Datensätze)

Neue Abfrage:

SELECT *
FROM 301011_Abmessungen AS t1
INNER JOIN Artikel AS t2 ON ( t1.ImportID = t2.ImportID )
INNER JOIN 301011_TechnischeDaten AS t3 ON ( t1.ImportID = t3.ImportID )
INNER JOIN 301011_Zubehoer AS t4 ON ( t1.ImportID = t4.ImportID )
WHERE t1.ImportId like '%KRS32%'

Ergebnis: 0.2570 sek (94 Datensätze)

Ich verstehe die Welt gerade nicht mehr. (Die Key's habe ich so angelegt wie du es vorgeschlagen hast. Der AI bringt es ja wirklich nicht an dieser Stelle).

import_keys mit den Feldern id (INT PK + AI) und importid (varchar50 UK)

Heißt also ich könnte in jeder Tabelle auf die Spalte ImportId verzichten und dafür aber eine ImportKey-Spalte hinzufügen, welche am Ende aus der Tabelle Import_keys herangezogen wird und in der Abfrage auf diese auch beziehen?
Bitte warten ..
Mitglied: nxclass
25.07.2012, aktualisiert um 09:01 Uhr
Ich verstehe die Welt gerade nicht mehr.
bedenke bei deinen Tests: die DB ist nicht "dumm" - sie optimiert die Abfragen und erkennt evtl. das es sich um die selbe Abfrage handelt und gibt Dir das zwischen gespeicherte Ergebnis zurück.
Verwende daher möglichst eindeutige und unterschiedliche WHERE Bedingungen

Heißt also ich könnte in jeder Tabelle auf die Spalte ImportId verzichten
... das hat nur den geringen Effekt, dass die Datenmenge der Indexe kleiner wird, und so die suche der Schlüssel etwas schneller. ABER in der Tabelle 'Import_keys' muss dann aber zusätzlich noch nach der 'importId' gesucht werden, was wieder zeit kostet.

Führe mal deine Tests nur mit den Schlüsseln durch:
01.
SELECT t1.ImportID, t2.ImportID, t3.ImportID, t4.ImportID 
02.
FROM Artikel AS t1 
03.
INNER JOIN 301011_Abmessungen AS t2 ON ( t1.ImportID = t2.ImportID ) 
04.
INNER JOIN 301011_TechnischeDaten AS t3 ON ( t1.ImportID = t3.ImportID ) 
05.
INNER JOIN 301011_Zubehoer AS t4 ON ( t1.ImportID = t4.ImportID ) 
06.
WHERE t1.ImportId like '%KRS32%'
... wenn die Datenmengen (je Zeile) in den Tabellen sehr groß sind kann es auch einfach am laden der Daten von der Festplatte liegen.

EDIT:
Es geht mir persönlich aber um eine "Ordnung" weil ich die Tabelle ...
.. die Daten in einer Tabelle sind sicher "näher" beieinander auf der Festplatte als wenn diese in mehreren Tabellen verteilt sind - dies ist dann natürlich ausschlaggebend wenn die DB diese Daten laden muss.
Bitte warten ..
Mitglied: knut4linux
25.07.2012, aktualisiert um 09:16 Uhr
HI nxclass,

danke für dein Hilfe, du bist ein GOTT! Die Lösungsvariante, welche du als erstes vorgeschlagen hast, habe ich gestern Abend einfach noch mal umgesetzt.

Ich habe jetzt eine zusätzliche Tabelle in welcher ich, so wie du vorgeschlagen hast, der ImportId einen import_key verpasse. Bei den anderen Tabellen (Artikel, Abmessungen, TechnischeDaten usw) habe ich den Index unbenannt in import_key, AI für die Spalte gedropt und über eine Abfrage die ID aus der Tabelle import_keys herangeholt.

Folgende Abfrage habe ich dazu verwendet (Bsp).

UPDATE Artikel SET `import_key` = (SELECT Max(import_keys.id) FROM import_keys WHERE import_keys.ImportId = Artikel.ImportId) ... usw.


Nach dem ich die import_keys in alles anderen Tabellen aktualisiert habe, habe ich nun der import_key -Spalte den PK >und der ImportId den Index verpasst.

Tabellen Analysiert und optimiert....

Nach Optimierung wieder meine Abfrage

SELECT *
FROM Artikel AS t1
INNER JOIN 301010_Abmessungen AS t2 ON ( t1.import_key = t2.import_key )
INNER JOIN 301010_TechnischeDaten AS t3 ON ( t1.import_key = t3.import_key )
INNER JOIN 301010_Zubehoer AS t4 ON ( t1.import_key = t4.import_key )

Ergebnis: 1,513 insgesamt, die Abfrage dauerte 0.0472 sek

Das Coole ist natürlich jetzt, dass ich meine Abfragen nun mit Key's erstellen kann und diese am Ende auch im Log nicht mehr angemeckert werden. Warum ich da selbst nicht darauf gekommen bin? Keine Ahnung wo ich mit meinen Gedanken war.

Resultat also: GEIL. So passt das! Sag bescheid wenn du mal in meiner Nähe bist, dann spendiere ich ein Bier!

Vielen Dank noch mal,

Knut
Bitte warten ..
Ähnliche Inhalte
Windows Netzwerk
Computereinstellungen werden übernommen. Dauert ewig
gelöst Frage von Mad-EyeWindows Netzwerk1 Kommentar

Hallo zusammen, ich versuche gerade herauszufinden warum alle unsere Computer etwa 2 Minuten im Bildschirm "Computereinstellungen werden übernommen" stehen ...

Drucker und Scanner
Seriendruck dauert ewig
gelöst Frage von sebob369Drucker und Scanner4 Kommentare

Hallo Forum, folgendes Problem: Ein Kunde hat eine Develop + 280 die über das Netzwerk angebunden und freigegeben ist. ...

Xenserver
Export VM dauert ewig
gelöst Frage von goodbytesXenserver4 Kommentare

Hallo, ich stehe vor dem Problem, dass ich VM`s von einem alten XEN-Server auf eine neue Maschine transferieren muss. ...

C und C++
Einfacher Webserver in C mit select()
Frage von Ah3n0bar6usC und C++1 Kommentar

Hallo liebe Fachleute, mein Kommilitone und ich sind ziemlich am verzweifeln, da unsere letzte Aufgabe im Studium eine "einfache" ...

Neue Wissensbeiträge
Windows 10

Autsch: Microsoft bündelt Windows 10 mit unsicherer Passwort-Manager-App

Tipp von kgborn vor 1 TagWindows 104 Kommentare

Unter Microsofts Windows 10 haben Endbenutzer keine Kontrolle mehr, was Microsoft an Apps auf dem Betriebssystem installiert (die Windows ...

Sicherheits-Tools

Achtung: Sicherheitslücke im FortiClient VPN-Client

Tipp von kgborn vor 1 TagSicherheits-Tools

Ich weiß nicht, wie häufig die NextGeneration Endpoint Protection-Lösung von Fortinet in deutschen Unternehmen eingesetzt wird. An dieser Stelle ...

Internet

USA: Die FCC schaff die Netzneutralität ab

Information von Frank vor 1 TagInternet5 Kommentare

Jetzt beschädigt US-Präsident Donald Trump auch noch das Internet. Der neu eingesetzte FCC-Chef Ajit Pai ist bekannter Gegner einer ...

DSL, VDSL

ALL-BM200VDSL2V - Neues VDSL-Modem mit Vectoring von Allnet

Information von Lochkartenstanzer vor 2 TagenDSL, VDSL2 Kommentare

Moin, Falls jemand eine Alternative zu dem draytek sucht: Gruß lks

Heiß diskutierte Inhalte
Windows Server
KMS Facts for Client configuration
Frage von winlinWindows Server13 Kommentare

Hey Leute, wir haben in unserem Netz nun einen neuen KMS Server. Haben Bestands-VMs die noch nicht aktiviert sind. ...

Windows Server
GPO nur für bestimmte Computer
Frage von Leo-leWindows Server13 Kommentare

Hallo Forum, gern würde ich ein Robocopy script per Bat an eine GPO hängen. Wichtig wäre aber dort der ...

Batch & Shell
Kann man mit einer .txt Datei eine .bat Datei öffnen?
Frage von HelloWorldBatch & Shell13 Kommentare

Wie schon im Titel beschrieben würde ich gerne durch einfaches klicken auf eine Text oder Word Datei eine Batch ...

Router & Routing
OpenWRT bzw. L.E.D.E auf Buffalo WZR-HP-AG300H - update
gelöst Frage von EpigeneseRouter & Routing11 Kommentare

Guten Tag, ich habe auf einem Buffalo WZR-HP-AG300H die alternative Firmware vom L.E.D.E Projekt geflasht. Ich bin es von ...