porno porno izle rokettube
Ergebnis 1 bis 5 von 5
Like Tree1Likes
  • 1 Post By Kaiuwe

Thema: Abfragen bei großen Datenmengen schneller ausführen

  1. #1
    Neuer Benutzer
    Registriert seit
    20.09.2016
    Beiträge
    9
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard Abfragen bei großen Datenmengen schneller ausführen

    Liebe Community,

    das hier ist mein zweiter Beitrag und im ersten wurde mir super schnell und sehr höflich geholfen.
    Nun habe ich ein Verständnisproblem und weiß nicht genau in welche Richtung ich laufen soll.

    Ich benutze eine Applikation, die ich auf der Grundlage des Blog-Tutorials entwickelt habe:
    https://framework.zend.com/manual/2....st-module.html

    Nun ist es so, dass ich eine 5-dimensionale Abhängigkeitsstruktur habe.

    1 Objekt von Class1 beinhaltet
    • n Objekte von Class2 beinhaltet
      • n Objekte von Class3 beinhaltet
        • n Objekte von Class4 beinhaltet
          • n Objekte von Class5



    - Der Controller nimmt nun den request entgegen, und gibt dem Service die Anweisung, ein Objekt mit der Class1 zu laden
    - Der Service reicht diese Anfrage direkt weiter an den Mapper, der dann weitere Abfragen durchführt und die o.g. Struktur zusammen setzt und ein vollständig befülltes Objekt von Class1 zurück gibt.

    Bei einer Struktur dauert das ca. 0,5 Sekunden was nicht sehr performant ist. Aus Zeitgründen habe ich dieses Konstrukt aber nicht mehr angefasst.
    Ich hatte damals einfach noch kein Verständnis für Services, Mapper, Controller und habe einige Bereiche davon bis heute nicht verstanden. Hierzu gleich mehr.

    Es kam nun eine neue Anforderung, es sollte die Möglichkeit geboten werden, mehrere tausend Objekte von Class1 zu vergleichen.
    Da in den Objekten Businesslogik zur Berechnung von Werten enthalten ist, musste ich also die gesamte Struktur für jedes Objekt laden.
    Es ergibt sich nun eine Zeit von ca. einer Minute bei 120 Objekten. Nicht akzeptabel.

    Nun habe ich mich an die Analyse gemacht und habe versucht, heraus zu finden, wo der Flaschenhals ist.

    Kurz zum Verständnis:
    Es gibt für ein komplexes Formular eine Konfiguration, die auch geändert werden kann.
    Diese Konfiguration steht in 4 Datenbanktabellen.
    Wenn nun das Formular gefüllt wird, werden die eingegeben Informationen in weiteren 4 Tabellen gespeichert.
    Beim laden eines Objektes Class1 wird zuerst die Konfiguration geladen, danach die gespeicherten Werte und dann wird beides zusammen geführt.

    indexAction

    Objekt Class1 aus der DB holen und hydrieren
    Code:
    Benötigte Zeit für Abfrage von Objekt Class1: 0.004999 Sekunden.
    Hier wird die Konfiguration geladen (0.005000 Sekunden)
    Code:
    Benötigte Zeit für monitoringconfig - abfrage - :Model\Sektion: 0.001000 Sekunden.
    Benötigte Zeit für monitoringconfig - abfrage - :Model\Untersektion1: 0.000999 Sekunden.
    Benötigte Zeit für monitoringconfig - abfrage - :Model\Untersektion2: 0.000999 Sekunden.
    Benötigte Zeit für monitoringconfig - abfrage - :Model\Untersektion3: 0.001000 Sekunden.
    Benötigte Zeit für monitoringconfig - hydration - :Model\Sektion: 0 Sekunden.
    Benötigte Zeit für monitoringconfig - hydration - :Model\Untersektion1: 0 Sekunden.
    Benötigte Zeit für monitoringconfig - hydration - :Model\Untersektion2: 0.000999 Sekunden.
    Benötigte Zeit für monitoringconfig - hydration - :Model\Untersektion3: 0 Sekunden.
    Benötigte Zeit für monitoringconfig - hydration: 0 Sekunden.
    
    Hier werden die gespeicherten Werte geladen (0.233999 Sekunden)
    Code:
    Benötigte Zeit für monitoringconfig - abfrage - :Model\Sektion: 0.001999 Sekunden.
    Benötigte Zeit für monitoringconfig - abfrage - :Model\Untersektion1: 0.078999 Sekunden.
    Benötigte Zeit für monitoringconfig - abfrage - :Model\Untersektion2: 0.101000 Sekunden.
    Benötigte Zeit für monitoringconfig - abfrage - :Model\Untersektion3: 0.051000 Sekunden.
    Benötigte Zeit für monitoringconfig - hydration - :Model\Sektion: 0 Sekunden.
    Benötigte Zeit für monitoringconfig - hydration - :Model\Untersektion1: 0.000999 Sekunden.
    Benötigte Zeit für monitoringconfig - hydration - :Model\Untersektion2: 0 Sekunden.
    Benötigte Zeit für monitoringconfig - hydration - :Model\Untersektion3: 0 Sekunden.
    Benötigte Zeit für monitoringconfig - hydration: 0 Sekunden.
    
    Hier werden die Werte und die Konfiguration zusammen geführt.
    Code:
    Benötigte Zeit für hydration children : 0.018000 Sekunden.

    Der Flaschenhals ist also die Abfrage von ca. 100 Datensätzen der gespeicherten Werte in 3 verschiedenen Tabellen.
    Über PHP MyAdmin dauert das genauso lange.
    Ich habe die Vermutung, dass das am Auffinden der Daten in einer Liste von mittlerweile gut 200.000 Einträgen pro Tabelle liegt.


    Meine Idee das zu lösen ist wie folgt:

    1. Ich frage alle gewünschten Datensätze der 1. Ebene ab.
    2. Ich mache nur jeweils eine Abfrage pro Tabelle und suche nur einmal nach allen Datensätzen mit den IDs der Objekte aus der 1. Ebene.
    3. Ich kann das Hydrieren weiterhin dem Mapper überlassen und erhalte eine Array von mehrere Tausend Objekten zurück.
    4. Diese Füge ich dann im Service zusammen und übergebe sie an den Controller, der alles dann an den View übergibt.

    Somit ist ein wenig die Sache mit der relationalen Datenbank zerrissen, aber dafür kann ich nun auch 10.000 Objekte haben und es dauert statt ca. 1 Stunde nur noch 5-6 Sekunden, diese zu laden.


    Nun zur Frage: Gibt es einen besseren und einfacheren Weg?

    Wenn ich irgendwo unklar war oder ihr nicht folgen könnt, erkläre ich sehr gern.
    Bitte einfach fragen.

    Vielen Dank im Voraus für Eure Ideen.

    Liebe Grüße,
    Christian

  2. #2
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.499
    Thanks
    3
    Thanked 348 Times in 279 Posts

    Standard

    Zitat Zitat von ijisthee Beitrag anzeigen
    Der Flaschenhals ist also die Abfrage von ca. 100 Datensätzen der gespeicherten Werte in 3 verschiedenen Tabellen.
    Über PHP MyAdmin dauert das genauso lange.
    Dann liegt doch das Problem aber nicht im Programmcode, sondern in der Datenbank.
    Zitat Zitat von ijisthee Beitrag anzeigen
    Ich habe die Vermutung, dass das am Auffinden der Daten in einer Liste von mittlerweile gut 200.000 Einträgen pro Tabelle liegt.
    Leider liegst du mit deiner Vermutung daneben. Nur weil eine hohe Zahl an Datensätzen in einer Tabelle vorhanden sind, heißt das noch lange nicht, dass es dadurch zu erhöhten Abfragezeiten kommen muss.
    Schau dir mal die entsprechenden Datenbankabfragen mit „EXPLAIN“ an, hier kann bestimmt der tatsächliche Flaschenhals ausgemacht werden.

    (Und bitte kein „phpMyAdmin“ verwenden, dass ist eine echte Krücke und die schlechteste Wahl für Datenbankentwicklungen. Sollte deine IDE keine Werkzeuge für Datenbanken enthalten, dann kannst du auch das kostenlose Tool „Workbench“ von MySQL verwenden.)
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  3. #3
    Neuer Benutzer
    Registriert seit
    20.09.2016
    Beiträge
    9
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard

    Hallo Kaiuwe,

    ich weiß nicht, ob ich EXPLAIN richtig verstanden habe, ich glaube eher nicht.
    Allerdings hat es mich darauf gebracht, dass ich die Datenbank total falsch konfiguriert habe.

    Während der Entwicklung wollte ich viele Sachen ausprobieren und habe mich deshalb nicht an das Konzept der relationalen Datenbank gehalten, und Primär- und Sekundärschlüssel gesetzt sondern einfach nur die Tabellen ohne große Konfiguration.
    Nun habe ich das Nachgeholt und die Geschwindigkeit ist um den Faktor 10 gestiegen.

    Ich denke, ich werde es so machen, dass ich für den gewünschten Zweck nur fünf Abfragen mache, und dann die Daten programmatisch zusammen führen.
    Dadurch sollte ich noch einmal einen enormen Geschwindigkeitssprung machen. Und es macht mich recht unabhängig von der Datenmenge.

    Vielen Dank für den Denkanstoß!

    In Workbench muss ich mich noch einarbeiten. Bisher habe ich ausschließlich mit phpmyadmin gearbeitet.
    Auch hier vielen Dank für den Tipp!

    Beste Grüße,
    Christian
    Geändert von ijisthee (28.02.2017 um 11:32 Uhr)

  4. #4
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.499
    Thanks
    3
    Thanked 348 Times in 279 Posts

    Standard

    Zitat Zitat von ijisthee Beitrag anzeigen
    ich weiß nicht, ob ich EXPLAIN richtig verstanden habe, ich glaube eher nicht.

    Während der Entwicklung wollte ich viele Sachen ausprobieren und habe mich deshalb nicht an das Konzept der relationalen Datenbank gehalten, und Primär- und Sekundärschlüssel gesetzt sondern einfach nur die Tabellen ohne große Konfiguration.
    Damit hast du doch den „EXPLAIN“ korrekt verstanden, denn ohne Index muss das Datenbankmanagementsystem (DBMS) die komplette Tabelle durchsuchen und dies wird dann langsam.

    Zitat Zitat von ijisthee Beitrag anzeigen
    Ich denke, ich werde es so machen, dass ich für den gewünschten Zweck nur fünf Abfragen mache, und dann die Daten programmatisch zusammen führen.
    Bevor du etwas am Programmcode änderst, kannst du auch mal einen Profiler laufen lassen und schauen, ob überhaupt ein Flaschenhals in der Anwendung vorhanden ist. Und wenn ja, kannst du mit dem Profiler den Engpass ausmachen. „Xdebug“ bringt einen Profiler mit. Und mit einer Entwicklungsumgebung wie „PHPStorm“ kannst du auch das Ergebnis anschauen. (Siehe dazu in der „PHPStorm“-Doku.)

    Zitat Zitat von ijisthee Beitrag anzeigen
    In Workbench muss ich mich noch einarbeiten. Bisher habe ich ausschließlich mit phpmyadmin gearbeitet.
    „MySQL Workbench“ ist ein Tool. Auf dem Markt gibt es noch viele mehr. Ein weiteres Beispiel wäre „Navicat“ oder in dem bereits genannten „PHPStorm“ ist „DataGrip“ integriert. (Erlaubt die Entwicklungsumgebung die Einbindung von Datenbanken, hast du auch die automatische Code-Vervollständigung von Tabellen- und Spaltennamen in deinem Code.)
    ijisthee likes this.
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  5. #5
    Erfahrener Benutzer Avatar von Ralf
    Registriert seit
    14.12.2006
    Beiträge
    447
    Thanks
    0
    Thanked 46 Times in 36 Posts

    Standard

    Und nicht vergessen: Komplexe Modelstrukturen mit vielen Objekten und für viele Daten brauchen eben auch ihre Zeit, um initialisiert zu werden. Bei Massendaten in einer komplexen Modelstruktur kann dies durchaus seine Zeit kosten. Habe einmal für ein Forum mit einer komplexen Modelstruktur (alles sauber und sinnvoll designt) Zeiten von einigen Sekunden gemessen nur für den Aufbau der Modelstruktur. Bei der Umstellung auf Array-Daten, reduzierte sich die Laufzeit auf wenige Mikrosekunden. Hier ist CQRS das passende Stichwort.

    Gruß,

    Ralf

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 23.03.2011, 14:11
  2. Script per Zeitschalter ausführen
    Von gingin im Forum Konzepte & Ideen
    Antworten: 15
    Letzter Beitrag: 31.07.2010, 13:40
  3. jQuery in AJAX-Response ausführen
    Von Skywalker im Forum Javascript + RIA
    Antworten: 7
    Letzter Beitrag: 26.05.2010, 23:16
  4. Controller Actions nicht ausführen
    Von Dunkelziffer im Forum Auth
    Antworten: 4
    Letzter Beitrag: 03.03.2010, 15:42
  5. Erweiterte Inserts ausführen
    Von ots im Forum DB
    Antworten: 2
    Letzter Beitrag: 14.09.2009, 18:15

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •