Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: Lange Ladezeiten bei Anzeige der Bestellungen im Adminbereich

    cptlars

    • Neu im Forum
    • Beiträge: 21
    Hallo Leute,

    ich hätte da mal eine Frage bezüglich der "orders.php" im Adminbereich.

    Wir haben im Shop inzwischen ca. 150.000 Bestellungen drin.
    Das ist natürlich toll, aber dadurch sind die Ladezeiten dieser Seite extrem lang.
    Das öffnen dauert inzwischen gut 15 Sekunden (gefühlt 'ne halbe Ewigkeit).  :daumen-dreh:

    Hat einer von euch eventuell 'ne Idee wie man das optimieren könnte?

    Gruß
    Lars

    Linkback: https://www.modified-shop.org/forum/index.php?topic=17056.0
    Marktplatz - Eine große Auswahl an neuen und hilfreichen Modulen sowie modernen Templates für die modified eCommerce Shopsoftware

    Tomcraft

    • modified Team
    • Gravatar
    • Beiträge: 46.369
    • Geschlecht:
    Re: Lange Ladezeiten bei Anzeige der Bestellungen im Adminbereich
    Antwort #1 am: 01. Dezember 2011, 11:21:54
    Ich verschiebe das mal nach "Bugs oder Funktionsfehler", denn das sollte wirklich optimiert werden.

    Welche Shopversion setzt du ein?

    Grüße

    Torsten

    cptlars

    • Neu im Forum
    • Beiträge: 21
    Re: Lange Ladezeiten bei Anzeige der Bestellungen im Adminbereich
    Antwort #2 am: 01. Dezember 2011, 11:44:20
    Hauptsächlich den alten xt:Commerce mit den Servicepacks.
    Der soll jetzt aber nach modified eCommerce Shopsoftware 1.05 SP1a umgebaut werden.
    Die DB ist vom alten xt:Commerce - Shop.
    Das Problem ist mir aber in beiden Shops aufgefallen.

    Hab mal angefangen die SQL Anweisung etwas zu optimieren.
    Dauert jetzt zwar nicht mehr ganz so lang wie vorher aber immer noch zu lange für meinen Geschmack.  :daumen-dreh:
    Vielleicht kann man da ja noch was dran drehen...

    vorher:

    Code: PHP  [Auswählen]
    $orders_query_raw = "select
           o.orders_id,
           o.orders_status,
           o.afterbuy_success,
           o.afterbuy_id,
           o.customers_name,
           o.payment_method,
           o.date_purchased,
           o.last_modified,
           o.currency,
           o.currency_value,
           o.language,
           s.orders_status_name,
           ot.text as order_total
    from "
    .TABLE_ORDERS." o
    left join "
    .TABLE_ORDERS_TOTAL." ot on (o.orders_id = ot.orders_id),
    "
    .TABLE_ORDERS_STATUS." s
    where (o.orders_status = s.orders_status_id
           and s.language_id = '"
    .$_SESSION['languages_id']."'
           and ot.class = 'ot_total')
    or (o.orders_status = '0'
      and ot.class = 'ot_total'
      and s.orders_status_id = '1'
      and s.language_id = '"
    .$_SESSION['languages_id']."')"
    .$sort;

    nachher:

    Code: PHP  [Auswählen]
    $orders_query_raw = "select
           o.orders_id,
           o.orders_status,
           o.afterbuy_success,
           o.afterbuy_id,
           o.customers_name,
           o.payment_method,
           o.date_purchased,
           o.last_modified,
           o.currency,
           o.currency_value,
           o.language,
           s.orders_status_name,
           ot.text as order_total
    from "
    .TABLE_ORDERS." o
    left join ("
    .TABLE_ORDERS_TOTAL." ot, ".TABLE_ORDERS_STATUS." s) on (o.orders_id = ot.orders_id and o.orders_status = s.orders_status_id)
    where ( s.language_id = '"
    .$_SESSION['languages_id']."'
              and ot.class = 'ot_total')
    or (o.orders_status = '0'
       and ot.class = 'ot_total'
       and  s.orders_status_id = '1'
       and s.language_id = '"
    .$_SESSION['languages_id']."') "
    .$sort;

    Edit Dokuman: SQL Darstellung etwas lesbarer

    Tomcraft

    • modified Team
    • Gravatar
    • Beiträge: 46.369
    • Geschlecht:
    Re: Lange Ladezeiten bei Anzeige der Bestellungen im Adminbereich
    Antwort #3 am: 01. Dezember 2011, 11:48:15
    Ich bin mir nicht sicher, ob wir daran nicht schon geschraubt hatten. :-?

    Kannst du mal mit der "orders.php" aus modified eCommerce Shopsoftware testen?

    Grüße

    Torsten

    cptlars

    • Neu im Forum
    • Beiträge: 21
    Re: Lange Ladezeiten bei Anzeige der Bestellungen im Adminbereich
    Antwort #4 am: 01. Dezember 2011, 13:03:51
    Ihr habt da 'nen bissl an der DB gebastelt wa??
    Bekomme folgenden Fehler:

    Code: PHP  [Auswählen]
    1054 - Unknown column 'o.ibn_billnr' in 'field list'

    Aber davon mal abgesehen wenn ich den MySQL Befehl im PHPMyAdmin ausführe (ohne ibn_billnr) sind's trotzdem noch 6 Sekunden bei mir...

    Mit meiner leicht veränderten SQL Anweisung bin ich bei ca. 3 Sekunden...
    Würde mir das aber trotzdem bissl schneller wünschen wenn's geht...

    Also wenn jemand 'ne Idee hat her damit.  :-D

    Matt

    • Experte
    • Beiträge: 4.241
    Re: Lange Ladezeiten bei Anzeige der Bestellungen im Adminbereich
    Antwort #5 am: 01. Dezember 2011, 13:18:25
    Mach mal folgendes:

    Code: SQL  [Auswählen]
    ALTER TABLE  `orders_total` ADD INDEX (  `class` )
    ALTER TABLE  `orders_status` ADD INDEX (  `orders_status_id` )
    ALTER TABLE  `orders_status` ADD INDEX (  `language_id` )

    DokuMan

    • modified Team
    • Beiträge: 6.669
    • Geschlecht:
    Re: Lange Ladezeiten bei Anzeige der Bestellungen im Adminbereich
    Antwort #6 am: 01. Dezember 2011, 14:13:35
    Welcher von den $orders_query_raw SELECTs in der "/admin/orders.php" ist das denn?
    Da sind mehrere ähnliche drin, die wahrscheinlich alle um die zusätzliche JOIN-Abfrage erweitert werden sollen.

    cptlars

    • Neu im Forum
    • Beiträge: 21
    Re: Lange Ladezeiten bei Anzeige der Bestellungen im Adminbereich
    Antwort #7 am: 01. Dezember 2011, 14:46:30
    @Matt
    die Standard Indexe hatte ich schon gesetzt, bringen nur leider nicht wirklich viel...

    @ DokuMan
    In meinem Post handelt es sich um den letzten (wenn kein $_GET['cID'] oder $_GET['status'])
    Aber die sollten auf jeden Fall alle optimiert werden...
    Hab ich bei mir soweit auch schon in allen Anweisungen geändert

    DokuMan

    • modified Team
    • Beiträge: 6.669
    • Geschlecht:
    Re: Lange Ladezeiten bei Anzeige der Bestellungen im Adminbereich
    Antwort #8 am: 01. Dezember 2011, 14:56:59
    Weil's gerade thematisch gut passt:
    Wie muss denn der JOIN an die obige Syntax angepasst werden?

    Code: PHP  [Auswählen]
    from ".TABLE_ORDERS." o
     left join ".TABLE_ORDERS_TOTAL." ot on (o.orders_id = ot.orders_id),
          ".TABLE_ORDERS_STATUS." s
    where o.customers_id = '".xtc_db_input($cID)."'
    and ((o.orders_status = s.orders_status_id)
          or (o.orders_status = '0' and s.orders_status_id = '1'))
    and ot.class = 'ot_total'
    and s.language_id = '".$_SESSION['languages_id']."'
    order by orders_id DESC";

    Das "or" da drin verwirrt mich...?!

    cptlars

    • Neu im Forum
    • Beiträge: 21
    Re: Lange Ladezeiten bei Anzeige der Bestellungen im Adminbereich
    Antwort #9 am: 01. Dezember 2011, 15:14:01
    Probier's mal so:

    Code: PHP  [Auswählen]
    from ".TABLE_ORDERS." o
     left join (".TABLE_ORDERS_TOTAL." ot, ".TABLE_ORDERS_STATUS." s)
            on (o.orders_id = ot.orders_id and
                   (o.orders_status = s.orders_status_id or (o.orders_status = '0' and s.orders_status_id = '1'))
                )      
    where o.customers_id = '".xtc_db_input($cID)."'
    and ot.class = 'ot_total'
    and s.language_id = '".$_SESSION['languages_id']."'
    order by orders_id DESC";

    Müsste eigentlich funktionieren.  :-D

    [EDIT Tomcraft 01.12.2011: Full-Quote entfernt, siehe: FAQ: Full-Quotes und Groß-/Kleinschreibung - mit anderen Worten Netiquette!]

    DokuMan

    • modified Team
    • Beiträge: 6.669
    • Geschlecht:
    Re: Lange Ladezeiten bei Anzeige der Bestellungen im Adminbereich
    Antwort #10 am: 01. Dezember 2011, 17:06:41
    Ich hab den aktuellen Optimierungsstand mal in r2426 den Trunk geschoben, damit uns das nicht verloren geht.

    (von 6 Sekunden auf 3 Sekunden bei 150k Bestellungen ist schon mal ein Anfang) :)

    Danke an cptlars!

    Matt

    • Experte
    • Beiträge: 4.241
    Re: Lange Ladezeiten bei Anzeige der Bestellungen im Adminbereich
    Antwort #11 am: 01. Dezember 2011, 20:34:43
    @Matt
    die Standard Indexe hatte ich schon gesetzt, bringen nur leider nicht wirklich viel...
    [...]

    Kann ich mal einen EXPLAIN deiner Query sehen?

    cptlars

    • Neu im Forum
    • Beiträge: 21
    Re: Lange Ladezeiten bei Anzeige der Bestellungen im Adminbereich
    Antwort #12 am: 02. Dezember 2011, 07:42:45
    Code: SQL  [Auswählen]
    EXPLAIN SELECT o.orders_id, o.orders_status, o.afterbuy_success, o.afterbuy_id, o.customers_name, o.payment_method, o.date_purchased, o.last_modified, o.currency, o.currency_value, o.language, s.orders_status_name, ot.text AS order_total
    FROM orders o
    LEFT JOIN (
    orders_total ot, orders_status s
    ) ON ( o.orders_id = ot.orders_id
    AND o.orders_status = s.orders_status_id )
    WHERE (
    s.language_id =  '2'
    AND ot.class =  'ot_total'
    )
    OR (
    o.orders_status =  '0'
    AND ot.class =  'ot_total'
    AND s.orders_status_id =  '1'
    AND s.language_id =  '2'
    )
    ORDER BY o.orders_id DESC

    ergibt folgendes:

    Code: SQL  [Auswählen]
    1       SIMPLE  ot      REF     idx_orders_total_orders_id,class        class   34      const   155891  USING WHERE; USING TEMPORARY; USING filesort
    1       SIMPLE  o       eq_ref  PRIMARY PRIMARY 4       xtc.ot.orders_id        1       USING WHERE
    1       SIMPLE  s       eq_ref  PRIMARY PRIMARY 8       xtc.o.orders_status,const       1       USING WHERE

    Matt

    • Experte
    • Beiträge: 4.241
    Re: Lange Ladezeiten bei Anzeige der Bestellungen im Adminbereich
    Antwort #13 am: 02. Dezember 2011, 12:38:25
    Da ist in der aktuellen Konstellation wirklich nicht mehr viel rauszuholen. Problem ist halt der Stringvergleich für "ot.class".
    Ich hab das mal testweise auf die "sort_order" geändert, die ja ein numerischer Wert ist und bei mir aktuell keinen Index hat.

    Das sieht dann mit "ot.class" so aus:

    Code: SQL  [Auswählen]
    Zeige Datensätze 0 - 29 ( 12,588 insgesamt, die Abfrage dauerte 0.2053 sek.) [orders_id: 13485 - 13456]

    Und mit "ot.sort_order" so:

    Code: SQL  [Auswählen]
    Zeige Datensätze 0 - 29 ( 12,588 insgesamt, die Abfrage dauerte 0.0021 sek.) [orders_id: 13485 - 13456]

    Hab leider keinen Shop mit 150.000 Bestellungen.

    Um hier also in Zukunft auch bei großen Bestellständen einigermaßen performante Ergebnisse erzielen zu können wird man um einen Umbau und um einen Abschied vom "ot.class"-String nicht rumkommen.

    Query für "sort_order" sieht (bei mir) so aus, 40 ist die "sort_order" für "ot_total":

    Code: SQL  [Auswählen]
    SELECT o.orders_id, o.orders_status, o.afterbuy_success, o.afterbuy_id, o.customers_name, o.payment_method, o.date_purchased, o.last_modified, o.currency, o.currency_value, o.LANGUAGE, s.orders_status_name, ot.text AS order_total
    FROM orders o
    LEFT JOIN (
    orders_total ot, orders_status s
    ) ON ( o.orders_id = ot.orders_id
    AND o.orders_status = s.orders_status_id )
    WHERE (
    s.language_id =  2
    AND ot.sort_order =  40
    )
    OR (
    o.orders_status =  0
    AND ot.sort_order =  40
    AND s.orders_status_id =  1
    AND s.language_id =  2
    )
    ORDER BY o.orders_id DESC

    cptlars

    • Neu im Forum
    • Beiträge: 21
    Re: Lange Ladezeiten bei Anzeige der Bestellungen im Adminbereich
    Antwort #14 am: 05. Dezember 2011, 09:09:11
    @Matt

    Ich weiss, dass "ot.class" und "ot.sort_order" eigentlich das gleiche Ergebnis auswerfen. Allerdings ist "ot.class ja" im Backend einstellbar.
    Es hat auch nicht wirklich zeitlich merkbare Vorteile gebracht.
    Aber ich gebe dir Recht, dass es mehr Sinn macht mit einem INT Wert zu suchen als einen STRING zu vergleichen.

    Wie wäre es mit einem Bestellungen Archiv für ältere Bestellungen > einem Jahr?  :-?
    7 Antworten
    3228 Aufrufe
    11. März 2015, 10:40:37 von Bonner
    29 Antworten
    16689 Aufrufe
    17. Mai 2010, 12:12:40 von deepblue
    5 Antworten
    3947 Aufrufe
    13. Juni 2013, 16:53:48 von Whiteflash
    14 Antworten
    10693 Aufrufe
    18. April 2011, 13:57:36 von Thomas