Como o MariaDB Abre e Fecha as Tabelas
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 * 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 MariaDB 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 MariaDB com a opção de inicialização --open-files-limit=#
. Leia Seçã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 MariaDB 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
oumysqladmin 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. Leia "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. Leia "SHOW STATUS
".