Skip to the content
Documentation
Help Start
Reading in:
  • German: 9,059 of 9,059 pages
About the help in other languages
All help pages

Der SQL-Abfrage-Cache

Was der optionale SQL-Abfrage-Cache von Exponential für einen Datenbankadministrator tut - Modi und Speicher, was nie gecacht wird, wie Schreibzugriffe Ergebnisse ungültig machen, warum Schreibzugriffe außerhalb von…

Download as PDF

Address: https://doc.exponential.earth/learninminutes/exphelp/viewer/help/database-administrators/sql-query-cache.md

On this page

This page is a translation. Read the English original

Der SQL-Abfrage-Cache

Diese Seite richtet sich an Datenbankadministratoren, die wissen möchten, ob der SQL-Abfrage-Cache ihrer Website hilft und was er für Schreibzugriffe bedeutet, die sie selbst vornehmen. Der Cache behält die Zeilen, die ein SELECT zurückgegeben hat, und beantwortet dieselbe Anweisung erneut, bis ein Schreibzugriff auf eine ihrer Tabellen das Ergebnis veralten lässt. Er ist standardmäßig aus. Er funktioniert mit den Treibern für MySQL, MariaDB, PostgreSQL, SQLite und Oracle; der MongoDB-Treiber verwendet ihn nicht. Quelle: Der SQL-Abfrage-Cache und settings/querycache.ini.

Inhalt

  1. Die Einstellungen
  2. Was nie gecacht wird
  3. Wie Schreibzugriffe ungültig machen
  4. Schreibzugriffe außerhalb von Exponential
  5. Ihn einschalten
  6. Was normal ist, worauf Sie achten
  7. Checkliste

Die Einstellungen

settings/querycache.ini [QueryCacheSettings], überschrieben in settings/override/querycache.ini.append.php:

SchlüsselStandardBedeutung
Modeoffoff: nichts wird behalten. request: ein identisches SELECT wird in einer Anfrage nicht zweimal ausgeführt. shared: Ergebnisse werden auch über Anfragen hinweg behalten
StorageautoWo shared Ergebnisse hält: auto (APCu, wo der Prozess es hat, sonst Dateien), apcu oder file (var/<site>/cache/querycache/entries/, geteilt von jedem Webserver, der var/ einhängt)
ApcuReserve25Prozent von APCu, die frei bleiben müssen; darunter werden Ergebnisse nur für die Anfrage behalten
MaxAge300Längste Lebensdauer eines Ergebnisses in Sekunden, die Grenze für einen Schreibzugriff, den der Cache nicht sehen kann
MaxRows5000Ergebnisse mit mehr Zeilen werden nicht behalten
ExcludeTables[]ezsession, ezpending_actions, ezcollab_notification_ruleTabellen, deren SELECTs nie gecacht werden

[DebugSettings] Report=enabled fügt die Zähler des Cache der Debug-Ausgabe hinzu.

Was nie gecacht wird

  • Lesezugriffe innerhalb einer Transaktion;
  • Anweisungen, deren Tabellen sich nicht alle aus dem Text lesen lassen: eine Unterabfrage, ein Hinweis oder PARTITION in FROM, ein geklammerter Join, ein Kommentar, ein Anführungszeichen ohne Partner oder in einem Namen in Anführungszeichen, die Literale q'' von Oracle sowie E'' und Dollar-Quoting von PostgreSQL, alles, was kein einfaches SELECT ist. Jedes SELECT von UNION, MINUS, INTERSECT und EXCEPT wird gelesen. Ob ein Backslash maskiert, hängt vom Treiber ab: in den Literalen von MySQL ja, in denen von PostgreSQL (mit standard_conforming_strings an, der Voreinstellung; der Treiber liest die Einstellung aus der Verbindung), SQLite und Oracle nicht;
  • Anweisungen, deren Ergebnis keine Funktion ihrer Tabellen ist: NOW(), RAND(), UUID(), LAST_INSERT_ID(), Sperren (FOR UPDATE), Variablen, SQL_NO_CACHE; von PostgreSQL clock_timestamp(), txid_current(), die Funktionen pg_*() und FOR NO KEY UPDATE; von SQLite changes(), last_insert_rowid() und datetime('now');
  • Lesezugriffe auf temporäre Tabellen;
  • Ergebnisse mit mehr als MaxRows Zeilen und Lesezugriffe auf ExcludeTables.

Auf Oracle außerdem Anweisungen, die eine Sequenz, die Uhr, SYS_GUID, SYS_CONTEXT, DBMS_RANDOM oder den Katalog lesen.

Wie Schreibzugriffe ungültig machen

INSERT, REPLACE, UPDATE, DELETE, TRUNCATE, CREATE/ALTER/DROP TABLE, Indexänderungen und RENAME TABLE markieren die Tabellen, die sie nennen, als beschrieben. Ein Schreibzugriff, dessen Tabellen sich nicht lesen lassen, markiert alles als veraltet. Innerhalb einer Transaktion werden die Tabellen beim äußersten COMMIT markiert; bei ROLLBACK wird nichts markiert. Andere Prozesse (Skripte, der Admin-Host, Velocity) sehen die Änderung über eine gemeinsame Zustandsdatei in var/<site>/cache/querycache/. Die Datei wird unter einer Sperre auf state.lock geschrieben, die für jeden Benutzer beschreibbar sein muss, unter dem die Site läuft (FPM, Velocity, Cron); auf NFS braucht sie NFSv4 oder lockd. Ein Schreibzugriff, der die Sperre nicht nehmen kann, markiert alle Ergebnisse als veraltet, und Setup > Systeminformationen meldet das in Rot. TRUNCATE ... CASCADE und DROP ... CASCADE von PostgreSQL erreichen Tabellen, die die Anweisung nicht nennt, daher markieren sie ebenfalls alles als veraltet. Das Cache-Verzeichnis zu löschen ist sicher: Ergebnisse, die unter der gelöschten Zustandsdatei gehalten wurden, werden nie wieder geantwortet.

Schreibzugriffe außerhalb von Exponential

Der Cache kann einen Schreibzugriff mit einem SQL-Client, ein mysql < dump.sql, eine Wiederherstellung oder ein anderes Programm nicht sehen. Ergebnisse bleiben bis zu MaxAge Sekunden gültig. Leeren Sie ihn nach jedem solchen Schreibzugriff und nach jeder Wiederherstellung:

php bin/php/ezcache.php --clear-id=querycache --allow-root-user

oder unter Setup > Caches. --clear-all und die Tags content und ini schließen ihn ein.

Ihn einschalten

  1. Prüfen Sie APCu: Setup > Systeminformationen, Abschnitt PHP, oder php -m | grep apcu.
  2. Setzen Sie Mode=request in settings/override/querycache.ini.append.php; leeren Sie den INI-Cache, laden Sie PHP-FPM neu, starten Sie Velocity neu. Surfen Sie einen Tag lang.
  3. Setzen Sie Mode=shared auf dieselbe Weise. Beobachten Sie die Trefferquote unter Setup > Systeminformationen, Feld Datenbankabfragen.

Um ihn auszuschalten, setzen Sie Mode=off und gehen genauso vor; nichts muss gelöscht werden. Die Schaltflächen unter Setup > Caches und Setup > Systeminformationen (den Cache leeren, seine Zähler zurücksetzen) brauchen die Richtlinie setup/managecache.

Was normal ist, worauf Sie achten

  • Eine Trefferquote von 30 bis 40 Prozent direkt nach einem Leeren oder einem Neustart, die steigt, während Seiten besucht werden.
  • Der SQL-Profiler zählt nur Anweisungen, die die Datenbank erreicht haben: Eine warme Seite mit geteiltem Cache zeigt 0 (Langsame Abfragen finden).
SymptomUrsache
Eine Seite zeigt nach einer Änderung außerhalb von Exponential alte Datenden Abfrage-Cache leeren, wie oben
Die Trefferquote bleibt niedrigeine Tabelle, die die Seiten lesen, wird bei jeder Anfrage beschrieben; die Systeminformationen listen die zuletzt beschriebenen Tabellen; schließen Sie sie aus oder korrigieren Sie den Schreiber
Viele Dateien in entries/der Teil cache_cleanup läuft nicht
APCu voll, andere Caches verdrängtApcuReserve über 0 halten, MaxRows oder MaxAge senken oder apc.shm_size erhöhen
state.ser nicht schreibbarvar/<site>/cache/querycache/ muss für jeden Benutzer schreibbar sein, unter dem die Website läuft
„Schreibvorgänge konnten die Sperre des Zustands nicht nehmen“ in den Systeminformationenmachen Sie state.lock für jeden Benutzer schreibbar, unter dem die Website läuft (auf NFS: NFSv4 oder lockd), und leeren Sie danach den Query-Cache

Setzen Sie im Zweifel Mode=off und vergleichen Sie.

Checkliste

  • To do: Jede Betriebsanleitung, die außerhalb von Exponential in die Datenbank schreibt, endet mit dem Leeren des Abfrage-Cache.
  • To do: cache_cleanup ist eingeplant, wenn Storage file ist oder auto ohne APCu.
  • To do: Trefferquote und APCu-Speicher werden nach dem Umstellen auf shared beobachtet.

Verwandte Seiten

Werden Sie Exponential-Partner

Partner teilen ihre Informationen, stellen Mittel bereit, geben Beiträge zurück und entwickeln die Produkte mit uns, und so wächst Exponential. Eine Partner-Website und ein Dashboard sind für Mitte 2027 geplant: Werden Sie noch heute Partner, damit wir schneller wachsen und neue Funktionen früher liefern.

Something wrong on this page? Report an error

Documentation license

This documentation is free documentation, licensed under the GNU Free Documentation License 1.3 or later.

Exponential Copyright © 1998-2026 Exponential Foundation and 7x