tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von Bernd1984
  • 1 Beitrag von Biber2
ERLEDIGT
NEIN
ANTWORTEN
3
ZUGRIFFE
415
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von chmee
    chmee chmee ist offline mod | media
    tutorials.de Moderator
    Registriert seit
    Apr 2004
    Ort
    Berlin bei Potsdam
    Beiträge
    7.630
    Blog-Einträge
    4
    Für das derzeitige Projekt sitze ich also nun "mal wieder" an MySQL. Ich würde natürlich alle Queries soweit optimieren, dass ich das nicht später nochmal machen muss. Beim Querlesen auf anderen Seiten kommen dann solche Gedanken, wie man die Query ressourcenschonend schreibt.

    Geschwindigkeit sehe ich als primär an.

    Ist Geschwindigkeit auch mit Effizienz / niedriger Last gleichzusetzen ?

    Nun habe ich zB gelesen, dass
    Subselects schneller sind als Joins - (wenn man denn joins immer durch subselects ersetzen kann).
    Link

    Gibt es weitere solcher Hints, bzw. gibt es Fallstricke in Bezug auf die Versionsnummer?

    In meinem Fall habe ich eine Query, die sich über 8 Tabellen erstreckt - Normalform sei Dank.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    SELECT *
     
    FROM YP_Poster,YP_Poster_Data,YP_ImgFiles,YP_Poster_Desc,YP_Formate,YP_fArt,YP_fSize,YP_fDesc 
     
    WHERE YP_Poster.User_ID='".$_SESSION[User_ID]."'
     
    AND YP_Poster_Desc.Poster_ID=YP_Poster.Poster_ID 
    AND YP_Poster_Data.Poster_Data=YP_Poster.Poster_Data 
    AND YP_ImgFiles.File_ID=YP_Poster_Data.File_ID 
    AND YP_Poster_Data.Format_ID=YP_Formate.Format_ID
    AND YP_Formate.fArt_ID=YP_fArt.fArt_ID
    AND YP_Formate.fSize_ID=YP_fSize.fSize_ID
    AND YP_fSize.fDesc_ID=YP_fDesc.fDesc_ID

    Um also alle Poster eines Users -samt der Daten zum Poster- zu erhalten, wird so eine Query in dieser Form schon recht lang -sicherlich auch langsamer als eine andere Abfrageform.Wie würde man so eine Query effizienter notieren?

    mfg chmee
     
    Mein Blog - VideoFAQ - FotoFAQ - bei Flickr - DSLR Kleinanzeigen
    Benutzt den DANKE-Knopf oder bewertet den Beitrag

    "GEHT NICHT" HILFT NICHT, TESTET EURE CODES ONLINE UND GEBT KLARE INFOS!
    -> Regexp <- -> php <- -> Javascript <-

  2. #2
    Avatar von Bernd1984
    Bernd1984 Bernd1984 ist offline Kastenbrot
    Registriert seit
    Oct 2004
    Beiträge
    414
    Hallo chmee,

    SubSelects sind nur sinnvoll, wenn man dadurch die Datenmenge gegenüber einem Join reduziert.
    Also nur wenn es eine Bedingung gibt, die den SuSelect dann einschränkt.

    So könnte es dann aussehen:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    SELECT *
    FROM (SELECT * FROM YP_Poster WHERE YP_Poster.User_ID='".$_SESSION[User_ID]."') as YP_Poster
    INNER JOIN YP_Poster_Data ON YP_Poster_Data.Poster_Data=YP_Poster.Poster_Data
    INNER JOIN YP_ImgFiles ON YP_ImgFiles.File_ID=YP_Poster_Data.File_ID
    INNER JOIN YP_Poster_Desc ON YP_Poster_Desc.Poster_ID=YP_Poster.Poster_ID 
    INNER JOIN YP_Formate ON YP_Poster_Data.Format_ID=YP_Formate.Format_ID
    INNER JOIN YP_fArt ON YP_Formate.fArt_ID=YP_fArt.fArt_ID
    INNER JOIN YP_fSize ON YP_Formate.fSize_ID=YP_fSize.fSize_ID
    INNER JOIN YP_fDesc ON YP_fSize.fDesc_ID=YP_fDesc.fDesc_ID
    Ausserdem ist die schreibweise mit explizieten Joins viel übersichtlicher
    und "SELECT *" bei so vielen Tabellen ist auch nicht gerade übersichtlich.
    Daher besser im Select nur die Felder ausgeben lassen, die man wirklich benötigt.
    chmee bedankt sich. 
    Gruss Bernd
    Zitat Zitat von mAu
    * Unformatierten Quellcode schaue ich mir _nicht_ an!
    * Sollte ich euch bei einer Frage weitergeholfen haben, würde ich mich über eine positive Bewertung freuen.
    * Bitte die Netiquette beachten.
    * Vergesst nicht, beantwortete Fragen als erledigt zu markieren!

  3. #3
    Biber2 Biber2 ist offline Mitglied Gold
    Registriert seit
    Jan 2007
    Ort
    Bremen
    Beiträge
    215
    Moin chmee,

    wie auch schon in dem von Dir zitierten Link anklingt:
    Eine pauschale Behauptung "SubSelects sind effizienter als explizite Joins (oder umgekehrt)" ist ein ziemlich schmales Brett.

    Und relativ schnell ad absurdum zu führen.
    Selbst in Deinem geposteten Beispiel, zu dem wir ja nur unsere Phantasie bezüglich der Datenvolumen in den Tabellen bemühen können, würde ich mir zum Beispiel rauspicken:

    Code :
    1
    2
    3
    4
    
    ...
    AND YP_ImgFiles.File_ID=YP_Poster_Data.File_ID 
    ...
    AND YP_Formate.fArt_ID=YP_fArt.fArt_ID

    Bei der ersten Relation unterstelle ich, dass, wenn in YP_ImgFiles insgesamt 10000 Datensätze sind, auch in der YP_Poster_Data-Tabelle der passende DS aus in etwa der gleichen Anzahl DS rausgeflöht werden muss.
    Ansatz: Inner-Join, da im Datenmodell vermutlich 1:1-Relation (oder 0/1:1?). und das ganze via EXPLAIN anschauen.

    Die zweite Relation dagegen, wo vielleicht eine von fünf YP_fArt.fArt_IDs aus einem Kennzeichen-Tabellchen geholt werden muss... da könnte ein Subselect flotter sein.

    Aber anyway - Du hast unterschiedliche Parent-Child-Beziehungen (1:1; 1:n; n:m..) und entsprechend auch sehr ungleichgewichtige Datensatzanzahlverhältnisse.

    Wenn Performanz für deine Appz/Deine Kunden ein wichtiges Gütekriterium ist, dann heißt es ohnehin optimieren statt pauschalieren.
    Also ran an EXPLAINs und Zugriffspfade und das Tuning.

    Grüße
    Biber
    Geändert von Biber2 (21.09.09 um 21:56 Uhr)
    chmee bedankt sich. 

  4. #4
    Avatar von chmee
    chmee chmee ist offline mod | media
    tutorials.de Moderator
    Registriert seit
    Apr 2004
    Ort
    Berlin bei Potsdam
    Beiträge
    7.630
    Blog-Einträge
    4
    Erstmal Danke Euch beiden, interessant zu lesen und das erhellt das Ganze ein bisschen..

    Zur Beispielquery :
    Das ImgFile ist das File zum Poster, Jenes ImgFile kann aber auch für ein weiteres Poster in einer anderen Größe genutzt werden, ergo 1:n.

    Ich schau mir mal EXPLAIN an und schreib mir mal verschiedene Queries, um zu schauen, wie die Zugriffe laufen. Danke.

    mfg chmee

    p.s.: Kann man denn eine Faustregel nennen ? Große 1:n oder 1:1 mit JOIN, kleine 1:1 oder 1:n mit Subselect oder Ähnlich?
     
    Mein Blog - VideoFAQ - FotoFAQ - bei Flickr - DSLR Kleinanzeigen
    Benutzt den DANKE-Knopf oder bewertet den Beitrag

    "GEHT NICHT" HILFT NICHT, TESTET EURE CODES ONLINE UND GEBT KLARE INFOS!
    -> Regexp <- -> php <- -> Javascript <-

Ähnliche Themen

  1. Java MySQL Geschwindigkeit
    Von Liutasil im Forum Java
    Antworten: 2
    Letzter Beitrag: 04.01.08, 12:10
  2. MySQL SELECET Abfrage geschwindigkeit?
    Von bossi im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 14.11.07, 23:42
  3. Antworten: 2
    Letzter Beitrag: 27.01.07, 16:00
  4. mysql Geschwindigkeit
    Von port29 im Forum Relationale Datenbanksysteme
    Antworten: 6
    Letzter Beitrag: 19.10.06, 14:42
  5. Antworten: 2
    Letzter Beitrag: 12.08.05, 10:34