Esta sección describe cómo funciona la caché de consultas cuando está operacional. Sección 5.12.3, “Configuración de la caché de consultas” describe cómo controlar si está o no operacional.
Las consultas se comparan antes de parsearla, así que las siguientes dos consultas se consideran diferentes por la caché de consultas:
SELECT * FROMtbl_name
Select * fromtbl_name
Las consultas deben ser exactamenten las mismas (byte a byte) para se consideradas idénticas. Además, las consultas que son idénticas pueden tratarse como diferentes por otras razones. Las consultas que usan distintas bases de datos, distintas versiones de protocolo, o distintos conjuntos de caracteres se consideran distintas consultas y se cachean por separado.
Antes que una consulta se guarde en la cache de consultas, MySQL
comprueba que el usuario tenga permisos de
SELECT
para todas las bases de datos y tablas
involucradas. Si no es el caso, el resultado cacheado no se usa.
Si un resultado de consulta se retorna desde la caché de
consultas, el servidor incrementa la variable de estado
Qcache_hits
, no
Com_select
. Consulte
Sección 5.12.4, “Estado y mantenimiento de la caché de consultas”.
Si una tabla cambia, entonces todas las consultas cacheadas que
usen esa tabla pasan a ser inválidas y se eliminan de la
caché.Esto incluye consultas que usen tablas
MERGE
que mapeen las tablas cambiadas. Una
tabla puede cambiarse por varios tipos de comandos, tales como
INSERT
, UPDATE
,
DELETE
, TRUNCATE
,
ALTER TABLE
, DROP TABLE
, o
DROP DATABASE
.
Las tablas transaccionales InnoDB
que se han
cambiado se invalidan cuando se realiza un
COMMIT
.
En MySQL 5.0, la caché de consultas también funciona dentro de
transacciones cuando se usa tablas InnoDB
,haciendo uso del número de versión para detectar si sus
contenidos han cambiado.
En MySQL 5.0, las consultas generadas por vistas se cachean. En MySQL 5.0.3 se resolvió un problema con los resultados en la caché de consultas generados por vistas que no se invalidaban apropiadamente tras algunas operaciones en dichas vistas. Consulte Sección C.1.9, “Cambios en la entrega 5.0.3 (23 Mar 2005: Beta)”.
Antes de MySQL 5.0, una consulta que empezase con un comentario podía cachearse, pero no podía obtenerse de la caché. Este problema está resuelto en MySQL 5.0.
La caché de consultas funciona para consultas del tipo
SELECT SQL_CALC_FOUND_ROWS ...
y
SELECT FOUND_ROWS()
.
FOUND_ROWS()
devuelve el valor correcto
incluso si la consulta precedente se obtuvo de la cache debido a
que el número de registros encontrados también se almacena en
la caché.
Una consulta no puede cachearse si contiene cualquiera de las siguientes funciones:
BENCHMARK() |
CONNECTION_ID() |
CURDATE() |
CURRENT_DATE() |
CURRENT_TIME() |
CURRENT_TIMESTAMP() |
CURTIME() |
DATABASE() |
ENCRYPT() con un parámetro |
FOUND_ROWS() |
GET_LOCK() |
LAST_INSERT_ID() |
LOAD_FILE() |
MASTER_POS_WAIT() |
NOW() |
RAND() |
RELEASE_LOCK() |
SYSDATE() |
UNIX_TIMESTAMP() sin parámetros |
USER() |
Una consulta tampoco se cachea bajo las siguientes condiciones:
Se refiere a funciones definidas por el usuario (UDFs).
Se refiere a variables de usuario.
Se refiere a las tablas en la base de datos del sistema
mysql
.
Es cualquiera de las siguientes formas:
SELECT ... IN SHARE MODE SELECT ... FOR UPDATE SELECT ... INTO OUTFILE ... SELECT ... INTO DUMPFILE ... SELECT * FROM ... WHERE autoincrement_col IS NULL
La última forma no se cachea ya que se usa como solución de ODBC para obtener el último ID insertado. Consulte Sección 25.1.6.1.1, “Obtaining Auto-Increment Values”.
Se usó como comando preparado, incluso sin emplear marcadores. Por ejemplo, la consulta usada aquí:
char *my_sql_stmt = "SELECT a, b FROM table_c"; /* ... */ mysql_stmt_prepare(stmt, my_sql_stmt, strlen(my_sql_stmt));
no se cachea. Consulte Sección 24.2.4, “Sentencias preparadas de la API C”.
Usa tablas TEMPORARY
.
No usa ninguna tabla.
El usuario tiene permisos a nivel de columan para cualquiera de las tablas involucradas.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.