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_nameSelect * 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.

