Eu testei várias consultas simples como:
SELECT COUNT(*) FROM Users WHERE courses='a';
Mas nenhum está sendo armazenado em cache. A seguir estão as variáveis relacionadas ao cache:
show variables like "%cache%";
+-------------------------------+----------------------+
| Variable_name | Value |
+-------------------------------+----------------------+
| aria_pagecache_age_threshold | 300 |
| aria_pagecache_buffer_size | 100000000 |
| aria_pagecache_division_limit | 100 |
| binlog_cache_size | 32768 |
| binlog_stmt_cache_size | 32768 |
| have_query_cache | YES |
| join_cache_level | 2 |
| key_cache_age_threshold | 300 |
| key_cache_block_size | 1024 |
| key_cache_division_limit | 100 |
| key_cache_segments | 0 |
| max_binlog_cache_size | 18000000000000000000 |
| max_binlog_stmt_cache_size | 18000000000000000000 |
| metadata_locks_cache_size | 1024 |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 0 |
| query_cache_strip_comments | OFF |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
| stored_program_cache | 256 |
| table_definition_cache | 400 |
| table_open_cache | 400 |
| thread_cache_size | 0 |
+-------------------------------+----------------------+
O status relacionado ao cache mostra:
show status like "%cache%";
+-----------------------------------+-------+
| Variable_name | Value |
+-----------------------------------+-------+
| Aria_pagecache_blocks_not_flushed | 0 |
| Aria_pagecache_blocks_unused | 15737 |
| Aria_pagecache_blocks_used | 2 |
| Aria_pagecache_read_requests | 78 |
| Aria_pagecache_reads | 3 |
| Aria_pagecache_write_requests | 6 |
| Aria_pagecache_writes | 0 |
| Binlog_cache_disk_use | 0 |
| Binlog_cache_use | 0 |
| Binlog_stmt_cache_disk_use | 0 |
| Binlog_stmt_cache_use | 0 |
| Com_assign_to_keycache | 0 |
| Qcache_free_blocks | 0 |
| Qcache_free_memory | 0 |
| Qcache_hits | 0 |
| Qcache_inserts | 0 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 0 |
| Qcache_queries_in_cache | 0 |
| Qcache_total_blocks | 0 |
| Ssl_callback_cache_hits | 0 |
| Ssl_session_cache_hits | 0 |
| Ssl_session_cache_misses | 0 |
| Ssl_session_cache_mode | NONE |
| Ssl_session_cache_overflows | 0 |
| Ssl_session_cache_size | 0 |
| Ssl_session_cache_timeouts | 0 |
| Ssl_used_session_cache_entries | 0 |
| Subquery_cache_hit | 0 |
| Subquery_cache_miss | 0 |
| Threads_cached | 0 |
+-----------------------------------+-------+
Li todo o manual e verifiquei se as seguintes condições são atendidas:
- a variável do servidor query_cache_type é definida como 1 ou ON
- as seguintes funções não estão presentes na consulta: BENCHMARK() CONNECTION_ID() CONVERT_TZ() CURDATE() CURRENT_DATE() CURRENT_TIME() CURRENT_TIMESTAMP() CURTIME() DATABASE() ENCRYPT() (um parâmetro) FOUND_ROWS() GET_LOCK() LAST_INSERT_ID() LOAD_FILE() MASTER_POS_WAIT() NOW() RAND() RELEASE_LOCK() SLEEP() SYSDATE() UNIX_TIMESTAMP() (sem parâmetros) USER() UUID() UUID_SHORT()
não é da forma:
SELECT SQL_NO_CACHE ... SELECT ... INTO OUTFILE ... SELECT ... INTO DUMPFILE ... SELECT ... FOR UPDATE SELECT * FROM ... WHERE autoincrement_column IS NULL SELECT ... LOCK IN SHARE MODE
- ele usa uma tabela não TEMPORARY
- não gera aviso
- ele não acessa uma tabela particionada
- ele não acessa uma tabela de INFORMATION_SCHEMA, mysql ou o banco de dados performance_schema
- não faz uso de variáveis de usuário ou locais
- não faz uso de funções armazenadas
- não faz uso de funções definidas pelo usuário
- não está dentro de uma transação com o nível de isolamento SERIALIZABLE
A única coisa que não tenho certeza é:
- o usuário não tem um privilégio de nível de coluna em nenhuma tabela na consulta
Eu corro SHOW FULL COLUMNS FROM Users;
e todas as colunas contêm "selecionar, inserir, atualizar". Mesmo as tabelas recém-criadas contêm esses privilégios. Alguém pode explicar o que pode estar errado?
Você perdeu uma coisa.
https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_query_cache_size