ilch Forum » Allgemein » HTML, PHP, SQL,... » Select Optimierung

Geschlossen
  1. #1
    User Pic
    Cartment Mitglied
    Registriert seit
    14.02.2007
    Beiträge
    372
    Beitragswertungen
    0 Beitragspunkte
    Un zwar hänge ich momentan an einer für mich problematischen Stelle. Gegeben sind hierbei zwei Abfragen, mit zwei Bedingungen, die so den Selektier Bereich eingrenzen.

    $offline =db_query(\"SELECT `a`, `b`, `c` FROM `table` WHERE `x`=0\");
    $online = db_query(\"SELECT `a`, `b`, `c`, `d`, `e`, `f` FROM `table` WHERE `x`=1\");

    Nun wäre es für mich vorteilhafter, wenn ich diese Abfragen in einander integrieren könnte, sodass ich am Ende lediglich ein Ergebnis hätte. Der Grund, wieso ich dies mache ist der, das diese Abfrage minütlich aufgerufen wird und ich mit der Einschränkung x=0 die Performance um ein erhebliches verbessern möchte.


    Zuletzt modifiziert von Cartment am 23.07.2009 - 18:35:39
    0 Mitglieder finden den Beitrag gut.
  2. #2
    User Pic
    Fire86 Mitglied
    Registriert seit
    25.04.2009
    Beiträge
    543
    Beitragswertungen
    0 Beitragspunkte
    Ich kenn die Rahmenbedingungen natürlich nicht, aber um damit die Performance spürbar zu verbessern, muss das schon eine gigantische Tabelle sein.
    Und selbst dann dauert die query selbst im Normalfall < 1ms.

    Wenn du die MySQL Performance wirklich verbessern willst, würde ich eher zu Cache Optimierungen in der mysql Config und einem vernünftigen Index in der Tabelle raten.

    Und auf PHP Seite solltest du mal schauen, ob du über SELECT COUNT() z.B. auch zum gewünschten Ergebnis kommen kannst, um auf eventuelle Schleifen und ähnliches verzichten zu können.
    Bei einer Online/Offline Abfrage (laut den Variablen), sollte das eigentlich machbar sein.
    Kein Support per Email oder ICQ!
    0 Mitglieder finden den Beitrag gut.
  3. #3
    User Pic
    Cartment Mitglied
    Registriert seit
    14.02.2007
    Beiträge
    372
    Beitragswertungen
    0 Beitragspunkte
    Die Tabellen können sehr gigantisch werden

    Und noch mal eine kurze Erklärung:
    Ich unterscheide aus dem Grunde zwischen Offline und Online,
    weil in dem Moment bei mir einige Felder weg fallen, die nicht übertragen
    werden müssen. Deshalb fragte ich auch, wie ich diese Abfrage zusammen führen könne.


    Zuletzt modifiziert von Cartment am 23.07.2009 - 21:21:52
    0 Mitglieder finden den Beitrag gut.
  4. #4
    User Pic
    Fire86 Mitglied
    Registriert seit
    25.04.2009
    Beiträge
    543
    Beitragswertungen
    0 Beitragspunkte
    Wie gesagt, wenn du wirklich was an der SQL Performance optimieren willst, erstmal an der MySql Config ansetzen.
    Davon gibt's genug vorgefertigte im Netz, einfach mal nach "my.cnf" oder "mysql optimieren" suchen.
    Dort findest du gute Tipps.

    Zuerst die querys zu optimieren, ist der falsche Ansatz und bringt auch kaum was.
    Das kann man höchstens als Feintuning bezeichnen.

    Du kannst im phpmyadmin auch mal ein Blick in die Laufzeit Informationen riskieren, dort siehst du, was auf dem Server wirklich los ist.
    Rot markierte Werte und ihre Erläuterung geben Aufschluss darüber, wo optimiert werden sollte.
    Kein Support per Email oder ICQ!
    0 Mitglieder finden den Beitrag gut.
  5. #5
    User Pic
    DjGeCk0 Hall Of Fame
    Registriert seit
    01.05.2009
    Beiträge
    2.989
    Beitragswertungen
    96 Beitragspunkte
    $statusqry =db_query("SELECT a, b, c FROM table WHERE x= blubb");
    
    if ($statusqry == 1) {
    $userstatus = 'offline';
    }
    else {
    $userstatus = 'online';
    }
    Alle Module von mir sind nun unter php-gecko.de erreichbar
    0 Mitglieder finden den Beitrag gut.
  6. #6
    User Pic
    Scriptpfuscher Mitglied
    Registriert seit
    24.06.2009
    Beiträge
    44
    Beitragswertungen
    0 Beitragspunkte
    wenn er mehr als 2 stati in x hatte ginge auch
    $statusqry =db_query("SELECT a, b, c FROM table WHERE x in ('1','0')");


    oder

    $statusqry =db_query("SELECT a, b, c FROM table WHERE x = 1 or x =0");


    oder
    $statusqry =db_query('SELECT a, b, c,CASE x WHEN "0" THEN "Offline" ELSE "Online" END as userstatus FROM table') ;



    aber ich denke nicht das auf deiner seite so viele queries gemacht werden das sich dadurch eine bemerkbare perfomance steigerung feststellen lässt.
    Und ohne genauere Angaben lässt sich eben recht wenig optimieren zwinker
    Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
    0 Mitglieder finden den Beitrag gut.
  7. #7
    User Pic
    Cartment Mitglied
    Registriert seit
    14.02.2007
    Beiträge
    372
    Beitragswertungen
    0 Beitragspunkte
    Also gut. Wenn ich sage das sie größer ist dann wird sie schon größer sein.
    Un zwar besitzt diese rund 16 Felder mit rund 5000 Einträgen(+), die minütlich von a nach b transferiert werden müssen. Deshalb auch die Einschränkung zwischen offline und online. Nun war lediglich meine Frage wie ich, die beiden gegebenen Abfragen vereinen könnte, da ich a, natürlich meine Server config verändere, da mir für meinen Fall nichts anderes übrig bleibt und b, ich das mit der Optimierung, lediglich für ein besseres Hintergrundwissen angeschrieben habe.
    0 Mitglieder finden den Beitrag gut.
  8. #8
    User Pic
    BobGrey Mitglied
    Registriert seit
    05.02.2007
    Beiträge
    423
    Beitragswertungen
    1 Beitragspunkte
    Vielleicht hilft dir das weiter :


    dev.mysql.com/doc/refman/5.1/de/left-join-optimization.html

    Damit werden Abfragen mit abhängikeiten realisiert.


    Bob
    0 Mitglieder finden den Beitrag gut.
  9. #9
    User Pic
    Mairu Coder
    Registriert seit
    16.06.2006
    Beiträge
    15.334
    Beitragswertungen
    386 Beitragspunkte
    Naja du kannst es einfach als eine Abfrage machen, es ist von der Performance her recht egal wie viele Spalten du aus einer Zeile abfragst, die Frage ist ja auch, wie du es weiterverarbeitest bzw. was du machen willst.
    Und auch immer mal ein Blick auf die FAQ werfen. | Mairus Ilchseite
    0 Mitglieder finden den Beitrag gut.
  10. #10
    User Pic
    Scriptpfuscher Mitglied
    Registriert seit
    24.06.2009
    Beiträge
    44
    Beitragswertungen
    0 Beitragspunkte
    ZitatZitat geschrieben von BobGrey

    Vielleicht hilft dir das weiter :


    dev.mysql.com/doc/refman/5.1/de/left-join-optimization.html

    Damit werden Abfragen mit abhängikeiten realisiert.


    Bob


    das bringt ihm in seinem fall rein gar nichtsausser evtl verwirrung
    zwinker
    Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
    0 Mitglieder finden den Beitrag gut.
  11. #11
    User Pic
    Cartment Mitglied
    Registriert seit
    14.02.2007
    Beiträge
    372
    Beitragswertungen
    0 Beitragspunkte
    Das ist es ja, ich würde ja gerne die beiden Abfragen vereinen.
    Nur weis ich nicht wie. Das mit der optimiererei und Performance,
    sollte lediglich als Hintergrundwissen dienen und nicht als Frage


    Zuletzt modifiziert von Cartment am 25.07.2009 - 15:29:24
    0 Mitglieder finden den Beitrag gut.
  12. #12
    User Pic
    Mairu Coder
    Registriert seit
    16.06.2006
    Beiträge
    15.334
    Beitragswertungen
    386 Beitragspunkte
    Wie gesagt, wenn du mehr Informationen geben würdest, wie du die Daten vor allem nach der Abfrage dann brauchst, könnte man ja mal etwas Code geben, du kannst in einer Abfrage allerdings nicht verschiedene Spaltenanzahlen abfragen, also wenn dann nur alle, bei deinem Bsp. a - f
    Und auch immer mal ein Blick auf die FAQ werfen. | Mairus Ilchseite
    0 Mitglieder finden den Beitrag gut.
Geschlossen

Zurück zu HTML, PHP, SQL,...

Optionen: Bei einer Antwort zu diesem Thema eine eMail erhalten