O Cache de Consultas do MySQL 5.5.9 não funciona quando os esquemas têm hifens (“-”) em seus nomes

5

Estou executando o MySQL 5.5.9 x86_64 RPM como baixado do mysql.com. Executando no CentOS 5.5 Xen DomU.

Eu habilitei o Query_cache, no entanto, o MySQL NUNCA o utiliza. Todas as minhas tabelas são InnoDB. Por que o Qcache nunca bateu?

UPDATE 2: Descobri que isso está limitado a esquemas com - no nome. Criando um novo esquema, por exemplo, new-db, o cache de consulta falha. Infelizmente eu tenho 148 Schama existentes, todos com '-' em seus nomes.

UPDATE isso parece ser limitado a esquemas que foram descartados e importados de uma versão anterior do MySQL (5.0.32) Criar um novo esquema e consultar tabelas neste cache de consulta funciona conforme o esperado. / p>

Aqui estão minhas configurações e exemplos de Qc funcionando e não funcionando.

mysql> SHOW VARIABLES LIKE '%query_cache%';
+------------------------------+-----------+
| Variable_name                | Value     |
+------------------------------+-----------+
| have_query_cache             | YES       |
| query_cache_limit            | 2097152   |
| query_cache_min_res_unit     | 4096      |
| query_cache_size             | 536870912 |
| query_cache_type             | ON        |
| query_cache_wlock_invalidate | OFF       |
+------------------------------+-----------+
6 rows in set (0.00 sec)


mysql> USE 'existing-schema';
Database changed

mysql> CREATE TABLE test (
    ->  'uid' INT AUTO_INCREMENT PRIMARY KEY,
    ->  'str' VARCHAR(255) NOT NULL
        -> ) ENGINE=InnoDB;
    Query OK, 0 rows affected (0.01 sec)

mysql> SHOW CREATE TABLE test;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                              |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test  | CREATE TABLE 'test' (
  'uid' int(11) NOT NULL AUTO_INCREMENT,
  'str' varchar(255) NOT NULL,
  PRIMARY KEY ('uid')
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> INSERT INTO test (str) VALUES ('one'),('two'),('three'),('four');
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> SHOW GLOBAL STATUS LIKE 'Qcache%';

+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| Qcache_free_blocks      | 1         |
| Qcache_free_memory      | 536852824 |
| Qcache_hits             | 0         |
| Qcache_inserts          | 0         |
| Qcache_lowmem_prunes    | 0         |
| Qcache_not_cached       | 56725     |
| Qcache_queries_in_cache | 0         |
| Qcache_total_blocks     | 1         |
+-------------------------+-----------+
8 rows in set (0.00 sec)

mysql> SELECT * FROM test;
+-----+-------+
| uid | str   |
+-----+-------+
|   1 | one   |
|   2 | two   |
|   3 | three |
|   4 | four  |
+-----+-------+
4 rows in set (0.00 sec)

mysql> SHOW GLOBAL STATUS LIKE 'Qcache%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| Qcache_free_blocks      | 1         |
| Qcache_free_memory      | 536852824 |
| Qcache_hits             | 0         |
| Qcache_inserts          | 0         |
| Qcache_lowmem_prunes    | 0         |
| Qcache_not_cached       | 89824     |
| Qcache_queries_in_cache | 0         |
| Qcache_total_blocks     | 1         |
+-------------------------+-----------+
8 rows in set (0.00 sec)

mysql> CREATE DATABASE new;
Query OK, 1 row affected (0.00 sec)

mysql> USE new;
Database changed
mysql> CREATE TABLE test (
    ->  'uid' INT AUTO_INCREMENT PRIMARY KEY,
    ->  'str' VARCHAR(255) NOT NULL
    -> ) ENGINE=InnoDB;
    Query OK, 0 rows affected (0.01 sec)

mysql> SHOW CREATE TABLE test;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test  | CREATE TABLE 'test' (
  'uid' int(11) NOT NULL AUTO_INCREMENT,
  'str' varchar(255) NOT NULL,
  PRIMARY KEY ('uid')
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)


    mysql> INSERT INTO test (str) VALUES ('one'),('two'),('three'),('four');
    Query OK, 4 rows affected (0.00 sec)

Records: 4  Duplicates: 0  Warnings: 0

mysql> SHOW GLOBAL STATUS LIKE 'Qcache%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| Qcache_free_blocks      | 1         |
| Qcache_free_memory      | 536852824 |
| Qcache_hits             | 0         |
| Qcache_inserts          | 0         |
| Qcache_lowmem_prunes    | 0         |
| Qcache_not_cached       | 89824     |
| Qcache_queries_in_cache | 0         |
| Qcache_total_blocks     | 1         |
+-------------------------+-----------+
8 rows in set (0.00 sec)

mysql> SELECT * FROM test;
+-----+-------+
| uid | str   |
+-----+-------+
|   1 | one   |
|   2 | two   |
|   3 | three |
|   4 | four  |
+-----+-------+
4 rows in set (0.00 sec)

mysql> SHOW GLOBAL STATUS LIKE 'Qcache%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| Qcache_free_blocks      | 1         |
| Qcache_free_memory      | 536851288 |
| Qcache_hits             | 0         |
| Qcache_inserts          | 1         |
| Qcache_lowmem_prunes    | 0         |
| Qcache_not_cached       | 109528    |
| Qcache_queries_in_cache | 1         |
| Qcache_total_blocks     | 4         |
+-------------------------+-----------+
8 rows in set (0.00 sec)

mysql> SELECT * FROM test;
+-----+-------+
| uid | str   |
+-----+-------+
|   1 | one   |
|   2 | two   |
|   3 | three |
|   4 | four  |
+-----+-------+
4 rows in set (0.00 sec)

mysql> SHOW GLOBAL STATUS LIKE 'Qcache%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| Qcache_free_blocks      | 1         |
| Qcache_free_memory      | 536851288 |
| Qcache_hits             | 1         |
| Qcache_inserts          | 1         |
| Qcache_lowmem_prunes    | 0         |
| Qcache_not_cached       | 126100    |
| Qcache_queries_in_cache | 1         |
| Qcache_total_blocks     | 4         |
+-------------------------+-----------+
8 rows in set (0.00 sec)

mysql> SHOW CREATE DATABASE new;
+----------+----------------------------------------------------------------+
| Database | Create Database                                                |
+----------+----------------------------------------------------------------+
| new      | CREATE DATABASE 'new' /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+----------------------------------------------------------------+
1 row in set (0.01 sec)

mysql> SHOW CREATE DATABASE 'existing-schema';
+------------------+---------------------------------------------------------------------------+
| Database         | Create Database                                                           |
+------------------+---------------------------------------------------------------------------+
| ezlead-live-data | CREATE DATABASE 'existing-schema' /*!40100 DEFAULT CHARACTER SET utf8 */ |
+------------------+---------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SHOW GRANTS FOR 'root'@'localhost';
+----------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost                                                                                                              |
+----------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '[REMOVED]' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION                                                                           |
+----------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
    
por thepearson 13.03.2011 / 00:43

2 respostas

6

Este é um bug no MySQL. Eu acho que a única solução atualmente é renomear meu esquema de banco de dados, para que eles não contenham hífens.

    
por 13.03.2011 / 21:13
0

Suas configurações de cache de consulta parecem bem. Consulte Como o cache de consultas funciona para detalhes sobre quais tipos de consultas SELECT não serão armazenadas em cache e ver se alguma coisa se aplica ao seu caso. Além disso, verifique o log de erros do MySQL em busca de mensagens relevantes.

O que você também pode fazer é emitir uma consulta SELECT muito simples que você sabe que deve ser armazenada em cache e verificar o Qcache_hits antes e depois da consulta. Tente criar um pequeno banco de dados de teste / tabela para excluir possíveis problemas com suas tabelas existentes. Se isso não funcionar, você sabe que algo mais sutil está errado com o MySQL.

    
por 13.03.2011 / 00:56