As variáveis do servidor table_cache
,
max_connections
e
max_tmp_tables
afetam o número máximo de
arquivos que o servidor mantêm abertos. Se você aumentar um ou
ambos destes valores, você pode ir contra um limite imposto
pelo seu sistema operacional no número de arquivos abertos por
processo. Você pode aumentar o limite de arquivos abertos em
muitos sistemas operacionais, embora o método varia muito de um
sistema para outro. Consulte a documentação de seu Sistema
Operacional para saber como fazê-lo, porque o método para
alterar o limite varia muito de um sistema para outro.
table_cache
é relacionado a
max_connections
. Por exemplo, para 200
conexões concorrentes em execução, você deve ter um tamanho
de cache de tabela de pelo menos 200 * n
,
onde n
é o número máximo de tabelas em um
join. Você também precisa reservar alguns descritores de
arquivos para tabelas e arquivos temporários.
Esteja certo de que o seu sistema operacional pode tratar o
número de descritores de arquivos abertos definido pelo valor
de table_cache
. Se
table_cache
for muito alto, o MySQL pode
esgotar os descritores de arquivo e recusar conexões, falhar na
execução de consultas e ser muito instavel. Você também têm
que levar em conta que o mecanismo de armazenamento
MyISAM
precisa de dois descritores de
arquivos para cada tabela aberta. Você pode aumentar o número
de descritores de arquivo disponíveis para o MySQL com a
opção de inicialização
--open-files-limit=#
. See
Secção A.2.17, “Arquivo Não Encontrado”.
A cache de tabelas abertas será mantido em um nível de
table_cache
entradas. O valor padrão é 64;
isto pode ser alterado com a opção -O
table_cache=#
do mysqld
. Note que o
MySQL pode temporariamente abrir mais tabelas para poder se
executar consultas.
Um tabela não usada é fechada e removida da cache de tabelas sob as seguintes circuntâncias:
Quando a cache está cheia e um thread tenta abrir uma tabela que não está na cache.
Quando a cache contém mais que
table_cache
entradas e uma thread não
está mais usando uma tabela.
Quando alguém executa mysqladmin refresh
ou mysqladmin flush-tables
.
Quando alguém executa uma instrução FLUSH
TABLES
.
Quando o cache de tabela encher, o servidor usa o seguinte procedimento para encontrar uma entrada de cache para usar:
Tabelas que não estiverem em uso são liberadas, na ordem LRU (least-recently-used), ou seja, a tabela que foi usada menos rcentemente.
Se o cache estiver cheio e nenhuma tabelas pode ser liberada, mas uma nova tabela precisar ser aberta, o cache é extendido temporariamente quando necessário.
Se o cache estiver no estado temporariamente extendido e uma tabela vai do estado em-uso para o fora-de-uso, a tabela é fechada e liberada do cache.
A table is opened for each concurrent access. This means the table needs to be opened twice if two threads access the same table or if a thread accesses the table twice in the same query (for example, by joining the table to itself).
Uma tabela é aberta para cada acesso simultâneo. Isto significa a tabela precisa ser aberta duas vezes se duas threads acessam a mesma tabela ou se uma thread acessa a tabela duas vezes na mesma consulta (por exemplo, fazendo um join da tabela com ela mesma). A primeira abertura de qualquer tabela exige dois descritores de arquivos; cada uso adicional da tabela exige somente um descritor. O descritor extra para a primeira abertura é para o arquivo de índice: este descritor é compartilhado entre todas as threads.
Se você está abrindo uma tabela com a instrução
HANDLER nome_tabela OPEN
, uma tabela dedicada
é alocada para a thread. Este objeto da tabela não é
compartilhado por outras threads e não será fechado até que a
thread chame HANDLER nome_tabela CLOSE
ou
seja finalizada. See Secção 6.4.9, “Sintaxe HANDLER
”. Quando isto
acontece, a tabela é colocada de volta na cache de tabela (se a
cache não estiver cheia).
Você pode conferir se o seu cache de tabela está muito pequeno
conferindo a variável opened_tables
do
mysqld
. Se este valor for muito grande, mesmo
se você não fez vários FLUSH TABLES
, você
deve aumentar o tamanho da sua cache de tabelas. See
Secção 4.6.8.3, “SHOW STATUS
”.
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.