[Frage] Backend bei TCA inline verdammt langsam... TYPO3-Version: 8.3.1

  • dsjiern dsjiern
    Typ im Roten Hemd
    0 x
    2 Beiträge
    0 Hilfreiche Beiträge
    18. 10. 2016, 19:34

    Hallo liebes Forum,

    ich habe mir eine Extension programmiert, die funktioniert an sich auch sehr gut, ich habe lediglich ein Problem:

    ich habe (unter anderem) eine Tabelle "techdetail", diese hat folgende Spalten:

    1. 'columns' => array(
    2. 'type' => array(
    3. 'label' => 'Typ',
    4. 'config' => array(
    5. 'type' => 'select',
    6. 'items' => array(
    7. array('Bitte auswählen',0),
    8. ),
    9. 'foreign_table' => 'techdetailtype',
    10. 'foreign_table_where' => 'AND sys_language_uid = 0',
    11. )
    12. ),
    13. 'value' => array(
    14. 'label' => 'Wert',
    15. 'config' => array(
    16. 'type' => 'input',
    17. )
    18. ),
    19. 'enum' => array(
    20. 'label' => 'Vordefinierter Wert',
    21. 'config' => array(
    22. 'type' => 'select',
    23. 'items' => array(
    24. array('Bitte auswählen',0),
    25. ),
    26. 'foreign_table' => '...',
    27. 'foreign_table_where' => 'AND techdetailtype_uid = (SELECT type FROM techdetail WHERE uid = ###THIS_UID###)',
    28. )
    29. ),
    30. 'sys_language_uid' => [
    31. ...
    32. ],
    33. 'l18n_parent' => [
    34. ...
    35. ],
    36. 'l18n_diffsource' => [
    37. ...
    38. ],
    39. ),

    die unwichtigen Einstellungen (minitems/maxitems/size/Spracheinstellungen) sowie die Tabellennabmen (tx_...) habe ich hier gekürzt.

    Diese technischen Details lassen sich per inline-Feld in die zweite Tabelle "products" einbinden:

    1. 'columns' => array(
    2. 'techdetails' => array(
    3. 'label' => 'Technische Daten',
    4. 'config' => array(
    5. 'type' => 'inline',
    6. 'foreign_table' => 'techdetail',
    7. 'foreign_field' => 'product_uid',
    8. 'foreign_sortby' => 'sorting',
    9. 'maxitems' => 99,
    10. 'appearance' => array(
    11. 'showPossibleLocalizationRecords' => TRUE,
    12. 'enabledControls' => array(
    13. 'localize' => TRUE,
    14. ),
    15. 'collapseAll' => TRUE,
    16. )
    17. ),
    18. ),
    19. [...]
    20. ),

    Jetzt ist es so, dass ich inzwischen ca. 200 Produkte in der Datenbank habe mit insgesamt über 5000 technischen Details. Wenn ich jetzt ein Produkt bearbeiten will das keine Technischen Details hinterlegt hat, so funktioniert das wunderbar, das Produkt öffnet sich in 1 Sekunde Ladezeit. Je mehr technische Details allerdings hinterlegt sind, desto länger dauert es, bis das Produkt (im Backend) geladen ist. Beispielsweise dauert es bei einem Produkt mit 4 Technischen Details insgesamt schon ca. 15 Sekunden, ein Produkt mit 30 Technischen Details dauert mehrere Minuten (!!) bis es geladen ist und ich es bearbeiten kann.

    Das TYPO3-System (8.3.1) läuft auf einem dedizierten Server (Debian 7, alle Updates installiert, Intel i7 8*3,4GHz mit 16GB RAM) verwaltet über Plesk 12.5.30 mit PHP 7.0.12 (fastCGI) MySQL 5.5.52.

    Wenn ich so ein Produkt im Backend aufrufe, so geht die CPU-Auslastung des PHP-Prozesses auf ca. 70%, MySQL geht auf 2 Mal ca. 30%. Und das über mehrere Minuten!

    Indizes habe ich in der Datenbank (glaube ich zumindest) alle angelegt:

    1. CREATE TABLE products (
    2. uid int(11) unsigned DEFAULT '0' NOT NULL auto_increment,
    3. pid int(11) DEFAULT '0' NOT NULL,
    4.  
    5. tstamp int(11) unsigned DEFAULT '0' NOT NULL,
    6. crdate int(11) unsigned DEFAULT '0' NOT NULL,
    7. deleted tinyint(4) unsigned DEFAULT '0' NOT NULL,
    8. hidden tinyint(4) unsigned DEFAULT '0' NOT NULL,
    9.  
    10. sys_language_uid int(11) DEFAULT '0' NOT NULL,
    11. l18n_parent int(11) DEFAULT '0' NOT NULL,
    12. l18n_diffsource mediumblob NOT NULL,
    13.  
    14. p_title varchar(255) DEFAULT '' NOT NULL,
    15. p_images int(11) DEFAULT '0' NOT NULL,
    16. p_description text NOT NULL,
    17. p_ordernumber varchar(255) DEFAULT '' NOT NULL,
    18.  
    19. similar int(11) DEFAULT '0' NOT NULL,
    20. supplies int(11) DEFAULT '0' NOT NULL,
    21. attr int(11) DEFAULT '0' NOT NULL,
    22. techdetails int(11) DEFAULT '0' NOT NULL,
    23. files int(11) DEFAULT '0' NOT NULL,
    24.  
    25. PRIMARY KEY (uid),
    26. KEY parent (pid)
    27. );
    28.  
    29. CREATE TABLE techdetail (
    30. uid int(11) unsigned DEFAULT '0' NOT NULL auto_increment,
    31. pid int(11) DEFAULT '0' NOT NULL,
    32.  
    33. tstamp int(11) unsigned DEFAULT '0' NOT NULL,
    34. crdate int(11) unsigned DEFAULT '0' NOT NULL,
    35. deleted tinyint(4) unsigned DEFAULT '0' NOT NULL,
    36. sorting int(11) unsigned DEFAULT '0' NOT NULL,
    37.  
    38. sys_language_uid int(11) DEFAULT '0' NOT NULL,
    39. l18n_parent int(11) DEFAULT '0' NOT NULL,
    40. l18n_diffsource mediumblob NOT NULL,
    41.  
    42. type int(11) unsigned DEFAULT '0' NOT NULL,
    43. value varchar(255) DEFAULT '' NOT NULL,
    44. enum int(11) unsigned DEFAULT '0' NOT NULL,
    45. product_uid int(11) unsigned DEFAULT '0' NOT NULL,
    46.  
    47. PRIMARY KEY (uid),
    48. KEY parent (pid),
    49. KEY product (product_uid)
    50. );

    Hat irgendjemand eine Idee, oder einen Tipp, warum das so langsam ist oder was ich ausprobieren könnte damit das schneller wird?

    Vielen Dank schonmal und liebe Grüße.
    Alex


  • 1
  • Sommerhit76 Sommerhit...
    Typ im Roten Hemd
    0 x
    2 Beiträge
    0 Hilfreiche Beiträge
    11. 10. 2017, 10:13

    Hm, ich habe exakt dasselbe Problem. Im Hintergrund werden massenhaft SQL-Statements abgesetzt, welche so aussehen, d. h. es ist nicht eine einzige Abfrage, welche das System (bei mir Version 8.7.8) in die Knie zwingt:

    [code]SELECT * FROM `tx_ext_domain_model_meinmodel` WHERE (`uid` = 2) AND (`tx_ext_domain_model_meinmodel`.`deleted` = 0)[/code]

    Dein Beitrag ist ja schon etwas länger her – hast du irgendeine Lösung gefunden?

    LG,
    Stefan

  • jakber jakber
    TYPO3-Anwärter
    0 x
    4 Beiträge
    0 Hilfreiche Beiträge
    24. 10. 2017, 12:41

    same problem here

  • dsjiern dsjiern
    Typ im Roten Hemd
    0 x
    2 Beiträge
    0 Hilfreiche Beiträge
    08. 11. 2017, 17:36

    Eine wirkliche Lösung habe ich nicht gefunden, ich habe den Server komplett neu aufgesetzt mit CentOS (davor Debian) und in jeder Tabelle neue KEYS über die Spalten "deleted", "hidden", "sorting" und "sys_language_uid".
    Damit dauert es wenigstens nur noch ca. 30 Sekunden um ein Produkt zu öffnen und nicht mehr mehrere Minuten.
    Die größte Auswirkung hatte dabei der Umstieg von Debian auf CentOS, wobei ich mir das nicht wirklich erklären kann.
    Die CPU-Auslastung bleibt die selbe, nur eben nur noch 30 Sekunden.

    Da es bei mir dann nicht mehr so viele Änderungen geben wird, habe ich das so belassen, da es mit den 30 Sekunden auch zu keinem Timeout mehr kommt und wir damit leben können, da es lediglich das Backend betrifft.

    Viele Grüße
    Alex

  • flt-andre flt-andre
    Typ im Roten Hemd
    0 x
    2 Beiträge
    0 Hilfreiche Beiträge
    14. 11. 2017, 16:15

    https://forge.typo3.org/issues/82730

  • 1