Ankündigung

Einklappen
Keine Ankündigung bisher.

Kann man abhängige Queries eigentlich optimieren?

Einklappen

Neue Werbung 2019

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

  • Thallius
    hat ein Thema erstellt Kann man abhängige Queries eigentlich optimieren?.

    Kann man abhängige Queries eigentlich optimieren?

    Hi,

    Man nehme eine Tabelle mit der Spalte "name". In der Tabelle sind sagen wir mal 100 Einträge. 50 Davon sind Müller, 50 Meier. Die Reihenfolge dabei ist rein zufällig. Also nicht erst 50 Müllen und dann 50 Meier.

    Ich zeige die Tabelle nun in meinem Webclient in einer HTML Tabelle an, welche aber nur 25 Einträge anzeigt und dann muss man weiterblättern. Ausserdem kann ich nach Namen filtern.

    Nehmen wir nun mal an, ich filtere nach Müller. Dann würde die Tabelle die ersten 25 Müller von insgesamt 50 Müller aus total 100 Einträgen anzeigen.

    Um dem User das transparent zu machen steht genau das unter der Tabelle:

    "Zeiger 25 von 50 Einträgen gefiltert von gesamt 100 Einträgen"

    Um diese Daten zu bekommen muss ich im Moment 3 Queries machen.

    1) SELECT COUNT(name) FROM tabelle
    2) SELECT COUNT(name) FROM tabelle WHERE name = "Müller"
    3) SELECT name FROM tabelle WHERE name = "Müller" LIMIT 1-25

    Wie man sieht ist aber 3 immer eine Teilmenge von 2 und das immer eine Teilmenge von 1 (Wenn man mal davon absieht, dass bei 1 + 2 nur die Anzahl abgefragt wird.

    Bei deisen einfachen Queries ist das ja noch ok aber ich habe teilweise extrem komplexe Queries mit mehrfachen JOIN, CASES und sogar INNER SELECT und vor allem Sortierungen. Das kratzt dann schon ganz schön an der Performance.

    Die Frage ist jetzt ob man es sich irgendwie zu nutze machen kann, dass die 3 Queries Untermengen voneinander sind. Kann man das der DB irgendwie sagen so ala "Der nächste Query kann nur Ergebnisse des vorherigen haben"?

    Oder gibt es da eventuell noch eine ganz andere Lösung?

    Gruß

    Claus

  • Thallius
    antwortet
    Zitat von erc Beitrag anzeigen
    Query 2 und 3 lassen sich mit SQL_CALC_FOUND_ROWS und FOUND_ROWS() zusammenfassen.
    Das ist ein guter Tipp das kannte ich noch nicht.

    Danke

    Claus

    Einen Kommentar schreiben:


  • erc
    antwortet
    Query 2 und 3 lassen sich mit SQL_CALC_FOUND_ROWS und FOUND_ROWS() zusammenfassen.

    Einen Kommentar schreiben:


  • ChristianK
    antwortet
    Bei grossen InnoDB Tabellen empfiehlt es sich, die gesamte Tabelle nur selten zu zählen. Dafür das Resultat zwischenspeichern.

    Auf ResultSets ein Count ausführen sehe ich nicht so ein Problem.

    Einen Kommentar schreiben:


  • VPh
    antwortet
    Wie man sieht ist aber 3 immer eine Teilmenge von 2 und das immer eine Teilmenge von 1 (Wenn man mal davon absieht, dass bei 1 + 2 nur die Anzahl abgefragt wird.
    Das ist ein sehr großes Wenn

    Also ein Beispiel mit einer komplexeren Query wäre schon sinnvoll, denke aber eh, dass man sowas von Fall zu Fall entscheiden muss. Eventuell mal den Queryplan anzeigen lassen ob man irgendwo was findet.
    "Der nächste Query kann nur Ergebnisse des vorherigen haben"
    Vielleicht das Resultset in eine View oder temporäre Tabelle hauen und dann darauf die nächste Query ausführen. Weiß nicht ob das ansatzweise sinnvoll ist, aber kann man ja mal ausprobieren.

    Einen Kommentar schreiben:


  • akretschmer
    antwortet
    Zitat von Thallius Beitrag anzeigen
    1) SELECT COUNT(name) FROM tabelle
    2) SELECT COUNT(name) FROM tabelle WHERE name = "Müller"
    3) SELECT name FROM tabelle WHERE name = "Müller" LIMIT 1-25
    diese Abfragen sind nicht voneinander abhängig.

    Einen Kommentar schreiben:

Lädt...
X