XOOPS Brasil

 

7.4. Tabelas HEAP

Tabeals HEAP usam índices hash e são armazenadas na memória. Isto as torna muito rápidas, mas se o MySQL falhar você irá perder todos os dados armazenados nela. HEAP é muito útil para tabelas temporárias!

As tabelas HEAP do MySQL utilizam hashing 100% dinâmico sem áreas em excesso. Não há espaços extras necessários para listas livres. Tabelas HEAP também não têm problemas com deleção + inserção, o que normalmente é comum em tabelas com hash:

mysql> CREATE TABLE test TYPE=HEAP SELECT ip,SUM(downloads) AS down
-> FROM log_table GROUP BY ip;
mysql> SELECT COUNT(ip),AVG(down) FROM test;
mysql> DROP TABLE test;

Aqui seguem algumas coisas que você deve considerar ao utilizar tabelas HEAP:

  • Você sempre deve utilizar a especificação MAX_ROWS na instrução CREATE para assegurar que você não irá utilizar toda a memória acidentalmente.

  • Índices só serão utilizados com = e <=> (mas é MUITO rápido).

  • Tabelas HEAP só podem usar chaves inteiras para procurar por uma linha; compare isto a tabelas MyISAM onde qualquer prefixo de chave pode ser usada para encontrar linhas.

  • Tabelas HEAP usam um formato de registro de tamanho fixo.

  • HEAP não suporta colunas BLOB/TEXT.

  • HEAP não suporta colunas AUTO_INCREMENT.

  • Antes do MySQL 4.0.2, HEAP não suportava um índice em uma coluna NULL.

  • Você pode ter chaves não únicas em uma tabela HEAP (isto não é comum em tabelas com hash).

  • Tabelas HEAP são compartilhadas entre todos os clientes (como qualquer outra tabela).

  • Você não pode pesquisar pela próxima entrada na ordem (isto é, usar o índice para fazer um ORDER BY).

  • Dados de tabelas HEAP são alocados em blocos menores. As tabelas são 100% dinâmicas (na inserção). Não são necessárias areas excessivas e espaço de chave extra. Linhas deletadas são colocadas em uma lista encadeada e são reutilizadas quando você insere novos dados na tabela.

  • Você precisa de memória extra suficiente para todas as tabelas HEAP que você quiser utilizar ao mesmo tempo.

  • Para liberar memória, você deve executar DELETE FROM tabela_heap, TRUNCATE tabeala_heap ou DROP TABLE tabela_heap.

  • O MySQL não pode descobrir aproximadamente quantas linhas existem entre dois valores (isto é utilizado pela atimizador de escala para decidar qual indice usar). Isto pode afetar algumas consultas se você alterar uma tabela MyISAM para uma tabela HEAP.

  • Para assegurar que você não vai cometer nenhum erro acidentalmente, você não pode criar tabelas HEAP maiores que max_heap_table_size.

A memória necessária para uma linha na tabela HEAP é:

SUM_OVER_ALL_KEYS(max_length_of_key + sizeof(char*) * 2)
+ ALIGN(length_of_row+1, sizeof(char*))

sizeof(char*) é 4 em uma máquina de 32 bits e 8 em uma máquina de 64 bits.