[MySQL 4.1] Alle Daten im Intervall zurückgeben

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #16
    Hi Leute,

    Bei genauerem drüber nachdenken ist fusers lösung vielleicht doch nicht so elegant:

    Nehmen wior mal folgendes an :

    1.) es soll ein Zeitraum von 2 Jahren abgedeckt werden, d.h. die Tabelle Zahl hat minumum 730 Zeilen (Ein für jeden Tag)
    2.) In der Tabelle Artikel liegen ca. 1000 Angebote

    Wenn ich SQL richtig gelernt habe und hier jetzt nicht auf dem Schlauch stehe bedeutet Fusers Join ein kleines Performance disaster :

    From ZAHL A left join ARTIKEL B on 1=1
    Schliesslich wierden hier die Tabellen mit 1=1 verbunden und nicht über Felder! Was dann soviel heisst wie jede Zeile aus Tabelle Artikel mit jeder Zeile aus Tabelle Zahl die dann wieder mit

    group by 1
    zusammengeführ und reduzeirt werden !

    Also überschlagen wir :

    1000 Artikel * 730 Tage = 730.000 Zeilenoperationen
    GROUP by 1 müsste in etwa noch einmal einen Durchlauf von 1000 Operationen bringen (das weiss ich allerdings nicht wirklich abzuschätzen da hier Durchlauf nicht wirklich = Operation)

    Also kommen wir auf eine Performance kurve :

    Artikel Tage Operationen
    im
    Intervall
    100 50 500000
    200 100 4000000
    300 150 13500000
    400 200 32000000
    500 250 62500000
    600 300 108000000
    700 350 171500000
    800 400 256000000
    900 450 364500000
    1000 500 500000000
    1100 550 665500000
    1200 600 864000000
    1300 650 1098500000
    1400 700 1372000000
    1500 750 1687500000
    1600 800 2048000000
    1700 850 2456500000
    1800 900 2916000000
    1900 950 3429500000
    2000 1000 4000000000


    Interesssant !! aber nicht elegant und sicher nicht rentabel
    chansel0049
    ----------------------------------------------------
    if you've reached the bottomline - dig further!
    Übersetzer gesucht? http://www.babelport.com

    Kommentar


    • #17
      Oh und MaRAUDER,

      Wenn meine Rechnung auch nur annähernd richtig ist bedeutet meine Methode für einen Interval von 2 Jahren 730 Einzeilenabfragen und das bei einen einfach linearen Aufwand und Fusers methode eine Abfrage mit 730000000 Operationen mehrfach quadratischen Aufwand

      Korrigiert mich wenn ich falsch liege!
      chansel0049
      ----------------------------------------------------
      if you've reached the bottomline - dig further!
      Übersetzer gesucht? http://www.babelport.com

      Kommentar


      • #18
        Hallo zusammen
        chansel0049:
        left join ARTIKEL B on 1=1 ist ein Full-Join (jeder mit jedem)
        und damit ein performance-Desaster.
        Es ist aber leider im PHP das gleiche.

        SQL:
        MySQL nimmt jeden Tag und jeden Artikel und überprüft die Zusammengehörigkeit.
        Macht:
        AnzahlTage * Anzahl Artikel

        PHP:
        Man gibt per Schleife (for ($tage = 0; $tage <150; $tage++) ) einen
        Tag vor und durchsucht alle Artikel, ob davon einer passt (mit Where SQL).
        AnzahlTage (PHP) * Anzahl Artikel (where MySQL).

        Ich will jetzt auch nicht gross über die Anzahl der Durchläufe diskutieren
        , denn
        für viele Artikel eignen sich beide Lösungen nicht als Online-Abfrage.

        Wenn das ganze schnell gehen soll, muss man die ganze Sache
        wohl täglich (Nachts per cron) in eine zusätzliche Tabelle schreiben
        und eine Abfrage von dieser Tabelle aus machen.
        Oder man erhöt beim Einfügen eines neuen Datensatzes
        diese Tabelle (PHP-Schleife Von-Bis-> Update Tabelle set ANZ=ANZ+1 where...)

        Oder jemand hat doch noch eine GANZ ANDERE Idee, die
        schnell genug ist für eine Online-Abfrage.

        Kommentar


        • #19
          Hi fuser,

          versteh mich nicht falsch, ich will hier nicht rummotzen oder so, ich finde nur das ist mal ne echt interessante Grundsatzdiskussion (Vielleicht kann ein Mod das ja verschieben)


          PHP:
          Man gibt per Schleife (for ($tage = 0; $tage <150; $tage++) ) einen
          Tag vor und durchsucht alle Artikel, ob davon einer passt (mit Where SQL).
          AnzahlTage (PHP) * Anzahl Artikel (where MySQL).
          Das glaube ich irgendwie nicht wirklich ein Join ist schliesslich mehr als eine Operation, schliesslich gehts dabei hier um Durchlauf, Prüfung, Verbindung, und dann noch die Group operationen dazu

          bei dem einfachen SELECT wär'S nur ein Durchlauf + Überprüfung

          Oder habe ich den Vorlesungen nicht aufgepasst?


          chansel0049
          ----------------------------------------------------
          if you've reached the bottomline - dig further!
          Übersetzer gesucht? http://www.babelport.com

          Kommentar


          • #20
            Hallo Marauder, wir vergessen Dich nicht...
            So wie es aussieht, ist das alles zu langsam zum online abfragen.
            Ich fürchte, Du musst einen cron-job einrichten, und dann würde
            ich an Deiner Stelle die Lösung nehmen, mit der Du besser klar kommst
            (auch für zukünftige Veränderungen...). Dann kannst Du auch Deinen Vorschlag nehmen, wenn der cron täglich läuft geht das ja auch recht schnell, da die Datenmenge auf einen Tag begrenzt werden kann.
            Das Datumsfeld dann als primary key, mit REPLACE einfügen.
            Dann kann der Update auch 2x am Tag laufen, ohne dass etwas schiefgeht.

            Das mit dem Full-Join hat mir doch zu Denken gegeben.
            Hier ohne:

            SELECT "2004-01-01" + INTERVAL Z DAY as TAG,
            count(VON) as ANZAHL
            from ZAHL A
            left join ARTIKEL B on
            TO_DAYS(VON)<=TO_DAYS("2004-01-01" + INTERVAL Z DAY) and
            TO_DAYS(BIS)>=TO_DAYS("2004-01-01" + INTERVAL Z DAY)
            group by 1

            Leider trotz Index und ohne Full-Join nur doppelt so schnell, also auch nicht das was Du wirklich brauchst.

            Zur Grundsatzdiskussion:
            Ich hab' doppelt so viele Artikel reingestellt-> hat doppelt so lange gedauert. Also kein mehrfach quadratischer Aufwand.

            Hab' schon einige seiten mit PHP-Select-Schleifen auf reine SQL's umgestellt, die waren dann wirklich IMMER schneller. Da hier kein 1:1 Join möglich ist, bin ich mir in diesem Fall aber nicht so sicher. Wäre interessant wenn das jemand 'mal ausprobiert.
            PHP ist halt ein Script das geparst werden muss, bei einem Kompilat wie mySQL läuft das (interne) Programm um ein Vielfaches schneller.

            Kommentar

            Lädt...
            X