Dubletten-Ansicht für Website-Benutzer

Wenn in größeren (aber auch generell) fe_users-Tabellen eines TYPO3 Dubletten vorhanden sind (was eigentlich nicht passieren dürfte*), kommt das Indexmanagement des mysql sehr schnell an seine Lastgrenzen.
Wenn dann gejointe Abfragen gestartet werden, gibt es einen erheblichen Performance-Unterschied wenn auch nur eine einzige Dublette im username vorhanden ist.
 
Um diese schnell finden zu können, kann man sich einfach die unten folgenden VIEWS in seine Datenbank packen (einfach im SQL-Feld des phpmyadmin abfeuern) und hat sofort eine wunderbare Übersicht über Dubletten.
Da VIEWS nur Ansichten sind, brauchen sie „keinen“ Speicherplatz und fressen auch sonst kein Brot 😉

  • Die VIEW „fe_users_dupes_witherrors_list“ stellt alle Dubletten dar, welche sogar aus Sicht von TYPO3 selbst fehlerhaft sind.
  • Die VIEW „fe_users_dupes_list“ stellt alle Dubletten dar, welche aus Sicht von TYPO3 fehlerhaft sind, aber zusätzlich auch alle die bei oben genannten Abfragen die Performance signifikant in den Keller ziehen.

Wenn man also ein sauberes TYPO3 haben möchte, welches noch dazu in der Performance keine künstlichen Bremsen im mysql haben soll, sollte also dafür sorgen das diese VIEWS immer 0 Datensätze als ergebnis liefern!

CREATE OR REPLACE VIEW `fe_users_dupes` AS
SELECT COUNT(`uid`) AS `Zeilen`,`username`,`pid`
FROM `fe_users`
GROUP BY `username`,`pid`
HAVING COUNT(`uid`)>1
ORDER BY `Zeilen` DESC
;


CREATE OR REPLACE VIEW `fe_users_dupes_list` AS
SELECT
`fe_users_dupes`.`Zeilen`,
`fe_users`.*
FROM `fe_users_dupes`
LEFT JOIN `fe_users`
ON `fe_users_dupes`.`username`=`fe_users`.`username`
;


CREATE OR REPLACE VIEW `fe_users_dupes_witherrors` AS
SELECT COUNT(`uid`) AS `Zeilen`,`username`
FROM `fe_users`
GROUP BY `username`,`pid`,`disable`,`deleted`
HAVING COUNT(`uid`)>1
ORDER BY `Zeilen` DESC
;


CREATE OR REPLACE VIEW `fe_users_dupes_witherrors_list` AS
SELECT
`fe_users_dupes_witherrors`.`Zeilen`,
`fe_users`.*
FROM `fe_users_dupes_witherrors`
LEFT JOIN `fe_users`
ON `fe_users_dupes_witherrors`.`username`=`fe_users`.`username`
;

* Das darf schon vorkommen. FE-User sind nur innerhalb ihrer Seite eindeutig (=> uniqueInPid: „Requires the field to be unique for the current PID (among other records on the same page). (Evaluated on the server only).“). Sofern FE-User aber am TCA/TYPO3 vorbei angelegt werden (z.B. Import-Routinen), greift diese Evaluierung nicht (weil eben nicht direkt in der Datenbank die Bedingung festgenagelt ist, sondern „nur“ im TCA).  

Caching Framework nutzen

Für umfangreichere Datenkonstrukte, die häufig verwendet werden oder aber aufwändig zu erzeugen sind, ist ein Cache nützlich. Ein typischer Fall sind Dateilisten, die sich auf Verzeichnissen generieren (z.B. für eine einfache Bildergalerie). Die Inhalte der Verzeichnisse ändern sich meist nur extrem selten – wozu also immer wieder aufs Neue via Dateisystem auslesen, welche Dateien existieren? Hier ist es doch naheliegender, die Liste zu cachen und nur selten oder gar nur via gezielter Anforderung zu aktalisieren.
Einen von vielen Fällen, wo das Caching Framework in einer eigenen Extension zum Einsatz kommen kann…

Weiterlesen»