[SQL allgemein] Umgang mit großen Datenmengen

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

  • [SQL allgemein] Umgang mit großen Datenmengen

    Hi,

    ich habe hier eine Statistiktabelle in die pro Aufruf einer Website ein (1) Eintrag geschrieben wird. Das wird benötigt um später ein Logging über die Referer, aurufenden IPs und Browser zu haben. Ne richtige Statistik eben.

    Die Timestamps sind UnixTimestamps die indiziert sind. Die Umrechnung der gefragten Zeit findent, um Zeit bei der Query zu sparen, in PHP statt.

    Auf dieser Tabelle werden verschieden Queries abgesetzt. Sag mir wieviel Hits es zwischen 1.4. und 1.5. gab, Wieviel Hits hatten wir dieses Jahr, usw.
    Allerdings während einem Join, also:

    SELECT count(stat.*) FROM page, stat WHERE page.page_id='xx' AND stat.page_id = page.page_id AND stat.timestamp > 123123123 AND stat.timestamp < 234234234

    In Wirklichkeit sind es 3 Tabellen, aber ich denke das hier sollte es veranschaulichen.

    Bisher war das auch kein Problem - mittlerweile ist es eben nur so das über diese Statistik sehr viele Seiten laufen und das mittlerweile etwas über 2.000.000 (2 Millionen) Einträge in der Tabelle sind.
    Dadurch wird das Fronted, das die Daten anzeigt, sehr seeeehr langsam.

    Kann mir jemand nen Tipp geben, wie ich es besser machen kann? Oder wie ich die Daten besser organisieren kann....

    Besten Dank...

  • #2
    bei einer Cross-Join-Abfrage (!) wundert dich das? Verwende INNER/LEFT/RIGHT JOIN mit gut überlegten Bedingungen in ON und nur was in WHERE, wenn es unbedingt sein muss.

    Kommentar


    • #3
      Ok,

      komm an das Thema erst im Laufe der nächsten Woche. Wollt nur schon mal nachfragen.

      Generell ist also gegen die Datenstruktur nichts zu sagen?

      Danke

      Kommentar


      • #4
        Original geschrieben von prego

        Generell ist also gegen die Datenstruktur nichts zu sagen?
        wenn die Zeile 42 so wie sie jetzt ist, ja

        Kommentar


        • #5
          42?

          Kommentar


          • #6
            ja, gibts auch bald zu sehen

            Kommentar


            • #7
              Original geschrieben von asp2php
              ja, gibts auch bald zu sehen
              OffTopic:
              mir graut's schon davor ...

              wenn ich schon sehe, dass zaphod dort nur einen kopf haben soll - dann ist die sache doch eigentlich gleich schon wieder gestorben, oder?
              I don't believe in rebirth. Actually, I never did in my whole lives.

              Kommentar


              • #8
                OffTopic:

                Zaphod hat zwei Köpfe...
                Sieht man im zweiten Trailer, da wo er auch mit den dritten Arm den Drink mixt. Allerdings ist der irgendwie unter seinem Kopf und kommt nur ab und zu hoch.



                asp2php: welche Zeile 42 meinst du? Oder hab ichs net gepeilt?

                Arg, jo, kammer natürlich schlecht sagen....
                Ok, ich formuliere meine Frage neu.

                Macht es sinn, pro visit (oder was auch immer für daten) einen datensatz zu erzeugen?

                Kommentar


                • #9
                  Original geschrieben von wahsaga
                  OffTopic:
                  mir graut's schon davor ...

                  wenn ich schon sehe, dass zaphod dort nur einen kopf haben soll - dann ist die sache doch eigentlich gleich schon wieder gestorben, oder?
                  OffTopic:
                  Jepp, eigentlich Schade ... aber ich werd' trotzdem rein schauen

                  Kommentar


                  • #10
                    Original geschrieben von prego
                    OffTopic:
                    Zaphod hat zwei Köpfe...
                    Sieht man im zweiten Trailer, da wo er auch mit den dritten Arm den Drink mixt. Allerdings ist der irgendwie unter seinem Kopf und kommt nur ab und zu hoch.
                    OffTopic:
                    echt? na dann ...
                    ich hatte bisher nur fotos gesehen, und auf denen gab's immer nur einen kopf.
                    I don't believe in rebirth. Actually, I never did in my whole lives.

                    Kommentar


                    • #11
                      Hoi,

                      bin jetzt an dem Thema dran.

                      Ich habe drei Tabellen (vereinfachte Darstellung):

                      gruppe - grupiert die urls zu einer logischen Gruppe und hat eine id (gruppe.id)
                      url - ist eine url und hat eine group_id = group.id
                      stat - bekommt pro Hit einer url einen Eintrag mit url_id = url.id

                      Mich interessiert momentan nur die Menge der Hits pro gruppe.
                      Meine Query sieht folgendermasen aus und sie funktioniert.

                      Code:
                      SELECT count(stat.url_id)
                      
                      FROM
                      gruppe AS gruppe
                      
                      RIGHT JOIN url AS url
                      ON url.group_id = group.id
                      
                      LEFT JOIN stat AS stat
                      ON stat.url_id = url.id
                      
                      WHERE
                      gruppe.id  = 24
                      (die zuweisung gruppe AS gruppe ist hier nur so, weil die Tabelle real bei mir anders heißen)


                      Mit dieser Query hab ich, bei ca. 900000 Datensätzen in der Stat-Tabelle, gegenüber eine WHERE x=x AND y=y Query schonmal die Hälfte Zeit gespart.

                      Krich ich es noch schneller hin? Weil auf der Ausgabe Seite diese Query 34mal gemacht wird. hmmm, vielleicht könnte ich sie ja noch mit in die query packen die sie 34 gruppen selektiert.... *grübel*

                      Any sugestions?

                      Kommentar


                      • #12
                        wenn du gruppe.id=24 begrenzt, wozu denn noch RIGHT JOIN zur url, da kannst du genauso gut ein INNER JOIN bauen und die Bedingung grouppe.id direkt in ON über AND verknüpfen, also probiere:

                        Code:
                        SELECT count(stat.url_id)
                        
                        FROM
                        gruppe gruppe
                        
                        INNER JOIN url url
                        ON (url.group_id = group.id AND gruppe.id  = 24)
                        
                        LEFT JOIN stat stat
                        ON stat.url_id = url.id
                        Außerdem AS weg!

                        Kommentar


                        • #13
                          Danke für die Anwort,

                          funktioniert natürlich, geschwindigkeitmässig ist es aber das gleiche. Wobei es eleganter aussieht. Wusste garnicht, das ich in ON auch AND n = 1 verknüpfen kann.

                          Hab auf meiner page jetzt mal die "ZählMalDieHits"-Sache auskommentiert. Es liegt noch an irgendwas anderem. Werde wohl das ganze in eine Query packen, macht am meisten Sinn. Melde mich mit Sicherheit gleich damit nochmal.

                          Wenn jemand Zeit hat, kann er dann nochmal kurz umreißen was der unterscheid zwischen LEFT INNER OUTER und RIGHT Join ist? Ich bin mir nicht sicher, ob ichs richtig verstanden habe.

                          Kommentar


                          • #14
                            Oh,

                            ich habs auch eben ein wenig schlecht beschrieben..

                            folgender zusammenhang:

                            gruppe -> gruppe_id
                            partner -> partner_id -> gruppe_id = gruppe.gruppe_id
                            url -> url_id -> partner_id = partner.partner_id
                            Stat -> stat_id -> url_id = url.url_id

                            So ist richtig. Nur zum richtigen Verständniss

                            Kommentar


                            • #15
                              Original geschrieben von prego

                              Wenn jemand Zeit hat, kann er dann nochmal kurz umreißen was der unterscheid zwischen LEFT INNER OUTER und RIGHT Join ist? Ich bin mir nicht sicher, ob ichs richtig verstanden habe.
                              ich hatte mal Zeit gehabt und hatte auch schon mal erklärt. Wenn du mal Zeit hättest, könntest du dich auch mal auf die Suche begeben

                              Kommentar

                              Lädt...
                              X