Optimierung meiner Abfrage

  • geschlossen
  • MySQL

  • karschti
  • 1061 Aufrufe 1 Antwort

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Optimierung meiner Abfrage

    Servus.

    Ich habe mir folgende View gebastelt:

    Quellcode

    1. CREATE VIEW `MarktStatistik`.`view_Item_Markt` AS
    2. SELECT iditems,itemName,itemUnique,itemVG ,
    3. (SELECT COUNT(*) FROM forakesh WHERE items_iditems = i.iditems ) AS anzMarkt,
    4. (SELECT itemMarktDatum FROM forakesh WHERE items_iditems = i.iditems ORDER BY itemMarktDatum ASC LIMIT 0,1) AS altMarkt,
    5. (SELECT itemMarktDatum FROM forakesh WHERE items_iditems = i.iditems ORDER BY itemMarktDatum DESC LIMIT 0,1) AS neuMarkt,
    6. (SELECT SUM(itemGold) / count(*) FROM forakesh WHERE items_iditems = i.iditems) AS dsGOLD,
    7. (SELECT itemGold FROM forakesh WHERE items_iditems = i.iditems ORDER BY itemMarktDatum ASC LIMIT 0,1) AS hGold,
    8. (SELECT itemGold FROM forakesh WHERE items_iditems = i.iditems ORDER BY itemMarktDatum DESC LIMIT 0,1) AS nGold,
    9. (SELECT SUM(itemZustand) / COUNT(*) FROM forakesh WHERE items_iditems = i.iditems) AS dsZustand,
    10. round (
    11. (
    12. UNIX_TIMESTAMP( NOW() ) -
    13. UNIX_TIMESTAMP((SELECT itemMarktDatum FROM forakesh WHERE items_iditems = i.iditems ORDER BY itemMarktDatum ASC LIMIT 0,1))
    14. ) / (SELECT COUNT(*) FROM forakesh WHERE items_iditems = i.iditems ) / 3600
    15. ) AS dsStd
    16. FROM items AS i
    17. WHERE
    18. i.iditems IN (SELECT items_iditems FROM forakesh)
    Alles anzeigen


    Diese funktioniert recht gut, aber ist von der Performance her recht anspruchsvoll. Bei der Itemtabelle befinden sich ca. 5500 und der Forakeshtabelle 17500 Einträge. Die Anzahl ist steigend. Zur Zeit benötigt die Abfrage ca. 2,5 bis 3,5 Sekunden.

    Könnt Ihr mir bei der Optimierung helfen? Wenn ja, wie? :)
    Ref-Links sind verboten!
  • Hi,
    und OMG. Das ist mal die schlimmste Abfrage, die ich je gesehen habe :D
    Ich würde dir Raten erstmal eine Abfrage, in der du COUNT, MAX, MIN und SUM benutzt zu tätigen.
    So hast du schon mal 7 Abfragen rausgeschmissen. Das mit dem itemGold würde ich auch rausschmeißen und in einem seperaten Query machen (2 zu 1).
    Außerdem solltest du mit ROUND und den ganzen Mist, nicht den MySQL-Server belasten, sprich diese in deiner Programmiersprache tätigen.
    So sieht das alles schon mal besser aus und anstatt 11, nur noch 4 Abfragen.

    Alles andere liegt an deiner SQL-Struktur. Wenn du nur so an die Werte kommst, ist das meiner Meinung nach, eher eine schlechte Struktur ^^

    Gruß
    Broken Sword
    Auf dem Abstellgleis sah man ihn liegen,
    Auf dem Abstellgleis zwischen Schwelle und Gestein,
    Auf dem Abstellgleis im strömenden Regen,
    Auf dem Abstellgleis allein.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Broken Sword ()