A lista abaixo indica algumas das maneiras inas quais o servidor
mysqld
utiliza a memória. Onde aplicável, o
nome da variável do servidor relevante ao uso de memória é
fornecido:
O buffer de chave (variável
key_buffer_size
) é compartilhado por
todas as threads; Outros buffers usados pelo servido são
alocados quando necessários. See
Secção 5.5.2, “Parâmetros de Sintonia do Servidor”.
Cada conexão utiliza algum espaço específico da thread:
Uma de pilha (padrão de 64K, variável
thread_stack
), um buffer de conexão
(variável net_buffer_lenght
), e um
buffer de resultados (variável
net_buffer_lenght
). Os buffers de
conexões e resultados são aumentados dinamicamente para
max_allowed_packet
quando necessário.
Quando uma consulta está sendo executada, uma cópia da
string da consulta atual é também alocada.
Todas as threads compartilhas a mesma memória base.
Somente as tabelas ISAM
e
MyISAM
compactadas são mapeadas em
memória. Isto é porque o espaço de memória de 32-bits de
4GB não é grande o bastante para a maioria das grandes
tabelas. Quando sistemas com endereçamento de 64-bits se
tornarem comuns poderemos adicionar um suporte gieral para o
mapeamento de memória.
Cada requisição fazendo uma varredura sequencial em uma
tabela aloca um buffer de leitura (variável
read_buffer_size
).
Ao ler registros na ordem ``randômica'' (por exemplo,
depois de uma ordenação) um buffer de leitura randômico
é alocado para evitar pesquisas em disco. (variável
read_rnd_buffer_size
).
Todas as joins são feitas em um único passo, e a maioria
delas podem ser feitas mesmo sem usar uma tabela
temporária. A maioria das tabelas temporárias são tabelas
baseadas em memória (HEAP). Tabelas temporárias com uma
grande extensão de registros (calculada como a soma do
tamanho de todas as colunas) ou que contenham colunas
BLOB
são armazenadas em disco.
Um problema nas versões do MySQL anteriores a 3.23.2 é que
se uma tabela HEAP excede o tamanho de
tmp_table_size
, você recebe o erro
The table nome_tabela is full
. A partir
da versão 3.23.2, isto é tratado alterando automaticamente
a tabela em memória HEAP
para uma tabela
baseada em disco MyISAM
quando
necessário. Para contornar este problema, você pode
aumentar o tamanho da tabela temporária configurando a
opção tmp_table_size
do
mysqld
, ou configurando a opção do SQL
SQL_BIG_TABLES
no progrma cliente. See
Secção 5.5.6, “Sintaxe de SET
”. Na versão 3.20 do MySQL, o
número máximo da tabela temporária é
record_buffer*16
; se você estiver
utilizando esta versão, você terá que aumentar o valor
record_buffer
. Você também pode iniciar
o mysqld
com a opção
--big-tables
para sempre armazenar as
tabelas temporárias em disco. Entretanto isto afetará a
velocidade de várias consultas complicadas.
A maioria das requisições que realizam ordenação alocam um bufer de ordenação e 0-2 arquivos temporários dependendo do tamanho do resultado. See Secção A.4.4, “Onde o MySQL Armazena Arquivos Temporários”.
Quase todas as análises e cálculos são feitos em um
armazenamento de memória local. Nenhuma sobrecarga de
memória é necessário para ítens pequenos e a alocação
e liberação normal de memória lenta é evitada. A
memória é alocada somente para grandes strings
inesperadas; isto é feito com malloc()
e
free()
.
Cada arquivo de índice é aberto uma vez e o arquivo de
dados é aberto uma vez para cada thread concorrente. Uma
estrutura de tabela, estrutura de coluna para cada coluna e
um buffer de tamanho 3 * n
é alocado
para cada thread concorrente. (onde n
é
o maior tamanho do registro, sem levar em consideração
colunas BLOB
. Uma coluna
BLOB
utiliza de 5 a 8 bytes mais o
tamanho dos dados contidos na mesma. O manipulador de
tabelas ISAM
/MyISAM
irão usar um registro extra no buffer para uso interno.
Para cada tabela com colunas BLOB
, um
buffer é aumentado dinamicamente para ler grandes valores
BLOB
. Se você ler uma tabela, um buffer
do tamanho do maior registro BLOB
é
alocado.
Estruturas de manipulacão para todas tabelas em uso são salvos em um cache e gerenciado como FIFO. Normalmente o cache possui 64 entradas. Se uma tabela foi usada por duas threads ao mesmo tempo, o cache terá duas entredas para a tabela. See Secção 5.4.7, “Como o MySQL Abre e Fecha as Tabelas”.
Um comando mysqladmin flush-tables
fecha
(ou instruções FLUSH TABLES
) todas
tabelas que não estão em uso e marca todas tabelas em uso
para serem fechadas quando a thread atualmente em execução
terminar. Isto irá liberar efetivamente a maioria da
memória em uso.
ps
e outros programas de informações do
sistema podem relatar que o mysqld
usa muita
memória. Isto pode ser causado pelas pilhas de threads em
diferentes endereços de memória. Por exemplo, a versão do
ps
do Solaris conta a memória não usada
entre as pilhas como memória usada. Você pode verificar isto
conferindo a memória disponível com swap
-s
. Temos testado o mysqld
com
detectores comerciais de perda de memória, portanto tais perdas
não devem existir.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.