Dieser Abschnitt beschreibt, wie der Abfrage-Cache funktioniert, wenn er betriebsbereit ist. Abschnitt 5.14.3, „Konfiguration des Anfragen-Cache“, erläutert, wie Sie ermitteln können, ob die Betriebsbereitschaft gegeben ist.
Eingehende Abfragen werden vor Ihrer Verarbeitung mit denen im Abfrage-Cache verglichen; die folgenden beiden Abfragen werden also aus der Sicht des Abfrage-Caches als unterschiedlich betrachtet:
SELECT * FROMtbl_name
Select * fromtbl_name
Abfragen müssen absolut (das heißt bytegenau) gleich sein, damit sie als identisch gelten. Außerdem können Abfrage-Strings, die identisch sind, auch aus anderen Gründen wie unterschiedliche Abfragen behandelt werden. Abfragen, die verschiedene Datenbanken, Protokollversionen oder Standardzeichensätze verwenden, gelten als unterschiedliche Abfragen und werden separate im Cache abgelegt.
Bevor ein Abfrageergebnis aus dem Abfrage-Cache abgerufen wird,
prüft MySQL, ob der Benutzer die Berechtigung
SELECT
für alle betreffenden Datenbanken und
Tabellen hat. Ist dies nicht der Fall, dann wird das Ergebnis im
Cache nicht verwendet.
Wird ein Abfrageergebnis aus dem Abfrage-Cache zurückgegeben,
dann zählt der Server die Statusvariable
Qcache_hits
hoch, nicht aber
Com_select
. Siehe auch
Abschnitt 5.14.4, „Anfragen-Cache-Status und -Wartung“.
Wenn eine Tabelle geändert wird, werden alle Abfragen, die die
Tabelle verwenden, ungültig und insofern aus dem Cache
entfernt. Dies betrifft auch Abfragen, die
MERGE
-Tabellen verwenden, welche die
geänderte Tabelle abbilden. Eine Tabelle kann von vielen
Anweisungstypen geändert werden, so etwa
INSERT
, UPDATE
,
DELETE
, TRUNCATE
,
ALTER TABLE
, DROP TABLE
oder DROP DATABASE
.
Transaktionssichere InnoDB
-Tabellen, die
geändert wurden, werden ungültig, wenn eine
COMMIT
-Anweisung ausgeführt wird.
Der Abfrage-Cache funktioniert auch innerhalb von Transaktionen,
wenn Sie InnoDB
-Tabellen verwenden, denn
anhand der Tabellenversionsnummer bestimmt er, ob seine Inhalte
nach wie vor gültig sind.
In MySQL 5.1 werden Abfragen, die von Views erstellt werden, im Cache abgelegt.
Der Abfrage-Cache funktioniert bei Abfragen der Typen
SELECT SQL_CALC_FOUND_ROWS ...
und
SELECT FOUND_ROWS()
.
FOUND_ROWS()
gibt den korrekten Wert auch
dann zurück, wenn die vorherige Abfragen aus dem Cache geholt
wurde, da die Anzahl der gefundenen Datensätze ebenfalls im
Cache abgelegt ist.
Eine Abfrage landet nicht im Abfrage-Cache, wenn sie eine der Funktionen enthält, die in der folgenden Tabellen aufgeführt sind.
BENCHMARK() |
CONNECTION_ID() |
CURDATE() |
CURRENT_DATE() |
CURRENT_TIME() |
CURRENT_TIMESTAMP() |
CURTIME() |
DATABASE() |
ENCRYPT() mit genau einem Parameter |
FOUND_ROWS() |
GET_LOCK() |
LAST_INSERT_ID() |
LOAD_FILE() |
MASTER_POS_WAIT() |
NOW() |
RAND() |
RELEASE_LOCK() |
SYSDATE() |
UNIX_TIMESTAMP() ohne Parameter |
USER() |
Auch unter den folgenden Bedingungen wird eine Abfrage nicht im Abfrage-Cache gespeichert:
Sie verweist auf benutzerdefinierte Funktionen (UDFs).
Sie verweist auf Benutzervariablen.
Sie verweist auf Tabellen in der
mysql
-Systemdatenbank.
Sie hat eine der folgenden Formen:
SELECT ... IN SHARE MODE SELECT ... FOR UPDATE SELECT ... INTO OUTFILE ... SELECT ... INTO DUMPFILE ... SELECT * FROM ... WHERE autoincrement_col IS NULL
Die letzte Form wird nicht gespeichert, weil Sie als ODBC-Workaround zur Ermittlung des letzten Einfügekennungswertes eingesetzt wird. Siehe auch Abschnitt 25.1.6.1.1, „Abruf von Auto-Increment-Werten“.
Sie wurde als vorbereitete Anweisung abgesetzt, auch wenn keine Platzhalter verwendet wurden. So wird etwa folgende Abfrage nicht im Cache gespeichert:
char *my_sql_stmt = "SELECT a, b FROM table_c"; /* ... */ mysql_stmt_prepare(stmt, my_sql_stmt, strlen(my_sql_stmt));
Siehe auch Abschnitt 24.2.4, „C-API: Prepared Statements“.
Sie verwendet TEMPORARY
-Tabellen.
Sie verwendet überhaupt keine Tabellen.
Der Benutzer hat eine Berechtigung auf Spaltenebene für eine der betreffenden Tabellen.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.