Software Guide

Die besten Tipps, Anleitungen und Downloads

Ihre Werbung auf Software Guide

Sie möchten in dieser Box oder an anderer Stelle dieser Webseiten eine Werbung schalten? Sehen Sie sich dazu am besten einfach mal die verschiedenen Möglichkeiten an.


WordPress Permalinks und die Performance

6. Februar 2009 von Michael | Wordpress

In den WordPress-Admin-Einstellungen unter „Permalinks“ kann man die Darstellung der Artikel-URLs von WordPress entsprechend anpassen, um aus einer Artikel-URL wie etwa

http://www.beispiel.de/?p=1234

schönere URLs wie etwa

http://www.beispiel.de/kochrezepte/Apfelstrudel

generieren zu lassen. Das dient u.a. der Benutzerfreundlichkeit und bietet Vorteile im Bereich der Suchmaschinenoptimierung. Den Aufbau (auch „Struktur“ genannt, übersetzt vom engl. „structure“) der Permalinks kann man dabei fast beliebig festlegen, z.B.

  • www.beispiel.de/[Jahr]/[Monat]/[Tag]/[Artikel-Titel]
  • www.beispiel.de/[Kategorie]/[Artikel-Titel]
  • www.beispiel.de/[Autor]/[Artikel-Titel].

Wie Dougal Campbell nun darstellt, können manche Permalink-Kombinationen zu massiven Performance-Problemen im Blog führen.
Werden nämlich Permalinks mit den Bestandteilen Kategorie (%category%), Tag (%tag%), Autor (%author%) oder Artikel-Titel (%postname%) eingeleitet, so speichert WordPress in der Optionen-Tabelle im Feld „rewrite_rules“ umfangreiche Informationen für jede im Blog vorkommende Seite („Page“, nicht aber „Post“ bzw. Blog-Artikel) ab. Lt. Dougal ist nur dadurch WordPress einigermaßen performant in der Lage, anhand der URL auf die tatsächliche interne ID des Artikels bzw. der Seite zu schließen.

Betreibt man nun ein Blog mit vielen angelegten Seiten („Pages“), so kann sich dieses Datenbankfeld „rewrite_rules“ ins fast unermessliche füllen, was zu entsprechenden Performanceproblemen führen kann. So berichtet matthijs auf der [wp-testers] Mailingliste, dass er in einem seiner Blogs dieses Datenbankfeld nicht mehr per Browser oder Texteditor öffnen kann, weil beides dann aufgrund der großen Datenmenge einfach abstürzt.

On one of my sites I can’t even open the database field to take a look because my browser and text editor crash because of its size.

Im Folgenden mal als Beispiel, welche Information genau WordPress in dem Datenbankfeld ablegt, wenn wir eine der o.g. Permalinkstruktur verwenden und eine neue Seite „testseite-1“ anlegen:

[testseite-1/attachment/([^/]+)/?$] => index.php?attachment=$matches[1]
[testseite-1/attachment/([^/]+)/trackback/?$] => index.php?attachment=$matches[1]&tb=1
[testseite-1/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?attachment=$matches[1]&feed=$matches[2]
[testseite-1/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$] => index.php?attachment=$matches[1]&feed=$matches[2]
[testseite-1/attachment/([^/]+)/comment-page-([0-9]{1,})/?$] => index.php?attachment=$matches[1]&cpage=$matches[2]
[(testseite-1)/trackback/?$] => index.php?pagename=$matches[1]&tb=1
[(testseite-1)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?pagename=$matches[1]&feed=$matches[2]
[(testseite-1)/(feed|rdf|rss|rss2|atom)/?$] => index.php?pagename=$matches[1]&feed=$matches[2]
[(testseite-1)/page/?([0-9]{1,})/?$] => index.php?pagename=$matches[1]&paged=$matches[2]
[(testseite-1)/comment-page-([0-9]{1,})/?$] => index.php?pagename=$matches[1]&cpage=$matches[2]
[(testseite-1)(/[0-9]+)?/?$] => index.php?pagename=$matches[1]&page=$matches[2]

Diese Information wird für jede Blog-Seite angelegt; daher ist wohl leicht vorstellbar, wie viele Daten sich bei einem Blog mit mehr als 1000 Seiten in dem einzigen Datenbankfeld ansammeln.

wordpress.org hat inzwischen reagiert und in der Permalinks-Dokumentation den folgenden Hinweis aufgenommen:

For performance reasons, it is not a good idea to start your permalink structure with the category, tag, author, or postname fields. The reason is that these are text fields, and using them at the beginning of your permalink structure it takes more time for WordPress to distinguish your Post URLs from Page URLs (which always use the text „page slug“ as the URL), and to compensate, WordPress stores a lot of extra information in its database (so much that sites with lots of Pages have experienced difficulties). So, it is best to start your permalink structure with a numeric field, such as the year or post ID.

Fazit

Nach meiner Einschätzung kann man auch weiterhin einen Nicht-Zahlenwert, also z.B. die Kategorie (%category%), als ersten Permalink-Bestandteil verwenden, solange man nicht vorhat, viele Seiten („Pages“) im Blog anzulegen. Klassische Blogs sind damit also wohl nicht wirklich betroffen, da diese im Gegensatz zu vielen Posts meist nur eine Hand voll Pages aufweisen (z.B. „Über das Blog“, „Impressum“, „Kontakt“, …). Ganz anders kann es allerdings bei Webauftritten aussehen, bei denen WordPress als CMS eingesetzt wird. Beispielsweise sind in diesem Fall folgende Permalink-Strukturen anzuraten und führen nicht zum Aufblähen des Datenbankfeldes:

/%year%/%month%/%day%/%postname%/
/%year%/%month%/%postname%/
/%year%-%month%-%day%/%postname%/
/%year%-%month%/%postname%/
/%year%/%postname%/
/%post_id%/%postname%/
/%post_id%-%postname%/
/%post_id%/%category%/%postname%/
/%year%/%category%/%postname%/
/%year%-%postname%/

WordPress passt übrigens das Datenbankfeld automatisch an, sobald man die Permalink-Struktur aktualisiert und speichert.

Informationen zum Artikel:

Weiterblättern im Blog:

Was ist ein Trackback?

17 Trackbacks/Pings:

  • 1

    WordPress Ticker (12) — Software Guide

    Pingback vom 11. Februar 2009, 23:10


    Fatal error: Uncaught Error: Call to undefined function eregi_replace() in /kunden/151212_80993/webseiten/wp/wp-content/themes/sw-guide2/functions.theme.php:465 Stack trace: #0 /kunden/151212_80993/webseiten/wp/wp-content/themes/sw-guide2/comments.php(84): swg_formatCommentExcerpt('[...] Artikel P...', 180) #1 /kunden/151212_80993/webseiten/wp/wp-includes/comment-template.php(1471): require('/kunden/151212_...') #2 /kunden/151212_80993/webseiten/wp/wp-content/themes/sw-guide2/index.php(148): comments_template() #3 /kunden/151212_80993/webseiten/wp/wp-includes/template-loader.php(74): include('/kunden/151212_...') #4 /kunden/151212_80993/webseiten/wp/wp-blog-header.php(19): require_once('/kunden/151212_...') #5 /kunden/151212_80993/webseiten/wp/index.php(17): require('/kunden/151212_...') #6 {main} thrown in /kunden/151212_80993/webseiten/wp/wp-content/themes/sw-guide2/functions.theme.php on line 465