Zum Inhalt springen

Typo3-DB Optimierungen

Erstellt am 23. März 2006 · 5 Antworten · letzte Antwort am 7. Februar 2016

Tags: Datenbank, Cache & Performance, Diskussion

maxhb ·

Hallo!
Habe einw enig mit der Typo3-DB rumexperimentiert und würde gern mit Euch das vorläufige Ergebnis diskutieren:
Das Original-Posting stammt von http://www.typo3forum.net/forum/tools-und-tipps/5473-typo3-db-optimierung.html#post24464

maxhb schrieb

Hi!
Beim Anschauen der Typo3-Tabellen ist mir aufgefallen, dass dort Indizes sehr serh sparsam eingesetzt werden.
Wenn man mal darüber nachdenkt, dann gibt es aber diverse Spalten, die sich als Index nahezu anbieten. Dies sind insbesondere die Spalten "hidden", "deleted" und "sorting".

Ich hab' mal einen kleinen Versuch gestartet und meine Typo3-Db folgendermaßen modifiziert:

ALTER TABLE `cache_hash` ADD INDEX ( `hash` ( 4 ) ) ;

ALTER TABLE `pages` ADD INDEX ( `deleted` ( 1 ) ) ;
ALTER TABLE `pages` ADD INDEX ( `hidden` ( 1 ) ) ;
ALTER TABLE `pages` ADD INDEX ( `doktype` );
ALTER TABLE `pages` ADD INDEX ( `sorting` );

ALTER TABLE `tt_content` ADD INDEX ( `deleted` ( 1 ) ) ;
ALTER TABLE `tt_content` ADD INDEX ( `hidden` ( 1 ) ) ;

ALTER TABLE `sys_template` ADD INDEX ( `deleted` ( 1 ) ) ;
ALTER TABLE `sys_template` ADD INDEX ( `hidden` ( 1 ) ) ;
ALTER TABLE `sys_template` ADD INDEX ( `sorting` );

Mit diesen SQL-Kommandos werden eine Reihe von zusätzlichen Indizes angelegt (Keine Angst, der Vorgang kann problemlos wieder Rückgängig gemacht werden!).

Wie man sieht sind das noch längst nicht alle Tabellen, sondern nur die, die mir so auf Anhieb als besonders wichtig aufgefallen sind.

Nimmt man jetzt mal nur die reine Zeit, die DB-Anfragen zur Anzeige einer Seite benötigen, dann ergeben obige Anpassungen bei mir einen Speedup um den Faktor 300.
Konkret ist die mittlere Zeit für DB-Anfragen von 0,122s auf 0,0004s gesunden.

Das ist zwar in absoluter Zeit nicht die Welt, aber der Faktor 300 steht erstmal als grobe Abschätzung im Raum.

Mir ist klar, dass die Zeit, die DB-Anfragen benötigen nur ein Teil der CPU-Leistung sind, die Typo3 benötigt, aber wenn man solche Zugewinne geschenkt bekommt...

Die Messung der DB-Zugriffszeiten habe ich übrigens durch anpassen der Datei t3lib/class.t3lib_db.php vorgenommen und mr dort ein Logfile erstellen lassen. Habe dort die Methode exec_SELECTquery aufgebohrt:

    function exec_SELECTquery($select_fields,$from_table,$where_clause,$groupBy='',$orderBy='',$limit='')    {
        // Start
        static $total_time = 0;
        $logfile = '/tmp/max/typo3.log';
        
        if($total_time == 0) {
            $message = str_repeat('-',80) . "\n";
        } else {
            $message = '';
        }
        $message .= str_replace("\n"," ",$this->SELECTquery($select_fields,$from_table,$where_clause,$groupBy,$orderBy,$limit));
        $message = preg_replace("/(\s+)/"," ",$message);
        if(!function_exists('getmicrotime')) {
            function getmicrotime() {
            list($usec, $sec) = explode(" ",microtime());
            return ((float)$usec + (float)$sec);
            }
        }
        
        $start = getmicrotime();
        // Ende
        
        $res = mysql_query($this->SELECTquery($select_fields,$from_table,$where_clause,$groupBy,$orderBy,$limit), $this->link);
        if ($this->debugOutput)    $this->debug('exec_SELECTquery');
        
        // Start
        $ende = getmicrotime();
        
        $time = $ende - $start;
        $total_time += $time;
        
        $message = $time . " (" . $total_time . ")\n" . $message . "\n";
        error_log($message,3,$logfile);
        // Ende
        return $res;
    }

Vielleicht mag ja mal jemand einen ähnlichen Versuch starten und seine Ergebnisse hier posten.

Ganz allgemein frage ich mich, ob die Tatsache, dass Typo3 so wenige Indizes verwendet Absicht ist oder ob sich noch niemand die Mühe gemacht hat, das DB-Modell mal genauer anzuschauen.

cu
maxhb

CU
maxhb

maxhb ·
just2b schrieb

hast du das schon in die dev-liste gepostet?

Ne, wollte erstmal nachfragen, ob jemand diese Beobchtungen nachvollziehen kann (außerdem müßte ich den Text wohl erst noch übersetzen oder?).
Oder ob es eine einfach und plausible Erklärung gibt, warum diese Felder bisher keine Indizes sind.

Kann mir irgendwie garnicht vorstellen, dass noch niemand daran gedacht hat, die Typo3-DB Struktur per Indizes zu optimieren... liegt ja irgendwie auf der Hand #paralyzed#

CU
maxhb

just2b ·
maxhb schrieb

Ne, wollte erstmal nachfragen, ob jemand diese Beobchtungen nachvollziehen kann.
Oder ob es eine einfach udn plausible Erklärung gibt, warum diese Felder bisher keine Indizes sind.

das werden dir wohl die Core-Leute beantworten können 😉

lg georg
PS: RS-Fehler in deiner sig

maxhb ·
just2b schrieb

hast du das schon in die dev-liste gepostet?

Ist mittlerweile geschen.

CU
maxhb

sventb ·

Ich wundere mich auch gerade, wieso bei TYPO3 auch in der neuesten Version auf diese Spalten keine Indizes gesetzt sind. Da die DB-Abfragen ja meistens "AND deleted=0 AND hidden=0" enthalten, sollte es doch Sinn machen, einen Index darauf zu setzen:

KEY visibility (deleted, hidden)