Denormalsieren in MySQL
Unter Denormalsieren versteht man die "bewusste Rücknahme einer Normalisierung zum Zweck der Verbesserung des Laufzeitverhaltens einer Datenbankanwendung." (Wikipedia) Hin und wieder ist es nötig Daten zu duplizieren um Abfragen schneller zu machen. Doch wie macht man das mit MySQL?
In MySQL gibt es mit dem INSERT...SELECT-Befehl ein mächtiges Werkzeug um Daten aus verschiedenen Tabellen in eine Neue einzufügen. Vor dem Einfügen können die Daten natürlich durch alle in SELECT verfügbaren Möglichkeiten manipuliert werden.
Leider ist es momentan in MySQL nicht möglich auf eine Tabelle im SELECT-Teil zuzugreifen und in die gleiche Tabelle zu schreiben. Deshalb gelingt das unten stehendes Beispiel nicht. (Nicht überprüft.)
In MySQL gibt es mit dem INSERT...SELECT-Befehl ein mächtiges Werkzeug um Daten aus verschiedenen Tabellen in eine Neue einzufügen. Vor dem Einfügen können die Daten natürlich durch alle in SELECT verfügbaren Möglichkeiten manipuliert werden.
Leider ist es momentan in MySQL nicht möglich auf eine Tabelle im SELECT-Teil zuzugreifen und in die gleiche Tabelle zu schreiben. Deshalb gelingt das unten stehendes Beispiel nicht. (Nicht überprüft.)
INSERT INTO pagelinks (pl_to)Dieses Problem kann allerdings relativ leicht umgangen werden. Man erstellte einfach eine neue Tabelle die ein Abbild jener ist die ergänzt werden soll. Der SQL-Code einer Datenbank kann mit "mysqldump -u benutzer -p datenbank -d tabelle" ausgelesen werden. Der Code muss danach angepasst werden (Tabellennamen ersetzen) und in die Datenbank eingespielt werden. Mit dem INSERT...SELECT-Befehl können danach die neue Tabelle wieder mit Daten aufgefüllt werden. Daraus ergibt sich dann in meinem Fall (mit der neuen Tabelle idlinks und da ich nicht ganz alle Daten brauche).
SELECT page.page_id
FROM page, pagelinks
WHERE page.page_namespace = pagelinks.pl_namespace
AND pagelinks.pl_title = page.page_title;
INSERT INTO idlinks (il_from,il_to)Nun haben wir immer noch ein Problem. Bei vielen Daten bricht die Operation irgendwann mit der Fehlermeldung "ERROR 1206 (HY000): The total number of locks exceeds the lock table size" ab. Dies liegt daran das der InnoDB-Buffer-Pool zu klein ist. Der Puffer kann in der Datei my.cnf wie folgt angepasst werde. (Neustarten der Datenbank nicht vergessen.)
SELECT pagelinks.il_from, page.page_id
FROM page, pagelinks
WHERE page.page_namespace = pagelinks.pl_namespace
AND pagelinks.pl_title = page.page_title;
[mysqld]
# Set buffer pool size to 50-80% of your computer's memory
innodb_buffer_pool_size=70M
innodb_additional_mem_pool_size=10M
Danach sollte diese Operation auch recht zügig ablaufen. Denormalisieren von Daten in MySQL ist nicht ganz eifach, mit ein wenig "pröblen" kommt man aber, wie dieser Artikel zeigt, auf gute Resulate.
comments
add a comment
The Trackback URL to this comment is:
http://leo.freeflux.net/blog/plugin=trackback(1609).xml
This blog is gravatar enabled.
Your email adress will never be published.
Comment spam will be deleted!





