quando eu reindexo meu banco de dados MySQL?

2

Meu banco de dados (MySQL) está passando por tempos limite de bloqueio intermitentes. Ainda não tenho uma causa raiz e ainda não temos recomendações. No passado, eu teria que reindexar meus índices do SQL Server e do Oracle porque eles precisavam. Ninguém fala sobre isso e o MySQL.

Alguma recomendação?

    
por Richard 02.08.2010 / 20:57

6 respostas

1

Você não precisa reindexar o MySQL, exceto em casos de corrupção de um travamento ou desligamento repentino. Se você está tendo problemas de bloqueio, você pode querer converter suas tabelas MyISAM (ou pelo menos as tabelas com os maiores problemas de contenção de bloqueio) para o InnoDB. Ele requer um pouco mais de RAM, mas suporta o bloqueio em nível de linha, em vez de apenas o bloqueio em nível de tabela (entre muitas outras melhorias).

Você também vai querer entrar e executar "show complete processlist"; para ter certeza de que não é algo deliberadamente bloqueando a tabela, como algum tipo de backup.

    
por 03.08.2010 / 08:51
1

Como já foi observado, o mecanismo de armazenamento selecionado é o principal fator que afeta o desempenho do MySQL. Se você usar MyISAM ou InnoDB, isso depende da sua carga de trabalho.

Se no seu caso os SELECTs são rápidos de fazer e não há muita atividade de gravação no DB, o MyISAM não é nada ruim. Mas se você tiver uma atividade de gravação moderada e alguns SELECTs de longa duração, lembre-se de que o MyISAM suporta apenas bloqueios de nível de tabela. Durante um lento SELECT, todas as atividades de gravação serão enfileiradas e, em breve, podem levar a todo tipo de problemas desagradáveis.

O InnoDB suporta bloqueios em nível de linha, transações e multiversão, de modo que até mesmo operações de leitura / gravação altamente misturadas não atrasarão tanto quanto o MyISAM.

Certifique-se também de que, seja qual for o mecanismo de armazenamento em uso, ele está devidamente ajustado. Para MyISAM key_buffer_size e table_cache são os valores mais importantes para ajustar, para o InnoDB a primeira coisa a ajustar é innodb_buffer_pool_size .

Mas ambos os mecanismos de armazenamento têm seus próprios truques: por exemplo, somente MyISAM suporta indexação de texto completo e o espaço de tabela InnoDB não diminui, portanto em uma tabela ativamente atualizada onde há muitas exclusões / atualizações / inserções acontecendo, você precisa despejar os conteúdos da tabela e sugá-los de vez em quando.

    
por 03.08.2010 / 09:02
1

Bloqueia o tempo limite? O MySQL é muito bem projetado a esse respeito, especialmente se você usa o mecanismo InnoDB. Índices não precisam ser re-indexados ... mas eles precisam ser corretamente indexados em primeiro lugar.

Se estamos falando de bloqueios reais, como no deadlock / timeout, você deve verificar se há algum comando LOCK TABLES suspeito.

    
por 10.01.2011 / 15:31
1

Soa como problemas com as estatísticas do índice.

Se você estiver usando o MyISAM, picos súbitos de INSERTs desviariam as estatísticas aos olhos do MySQL Query Optimizer. Isso levaria o MySQL Query Optimizer a adivinhar muito mal os planos EXPLAIN das consultas SELECT.

Se você é usando InnoDB, ANALYZE TABLE torna-se completamente inútil.

Desde que a tabela seja razoavelmente pequena, ANALYZE TABLE é tudo o que você pode realmente fazer pelo MyISAM. A reconstrução de índices pode ajudar as tabelas do InnoDB periodicamente.

Contanto que as tabelas não sejam escritas em detalhes, as estatísticas de índice permanecerão estáveis e os planos de consulta EXPLAIN permanecerão mais consistentes.

Lembre-se: assim que você tiver muitos INSERTs, UPDATEs e DELETEs, todas as apostas serão desativadas para estatísticas de índice confiáveis até a próxima reconstrução ou ANALYZE TABLE.

Com relação aos tempos limite de bloqueio intermitente, aqui está algo a considerar: é possível que SELECTs em tabelas InnoDB sejam timeout em Deadlocks.

As consultas SELECT podem executar bloqueios no gen_clust_index , também conhecido como Clustered Index.

Aqui estão três perguntas sobre o DBA Stack Exchange que eu analisei agressivamente com @RedBlueThing , a pessoa que fez essas perguntas . @RedBlueThing encontrou soluções para suas perguntas.

Por favor, leia estes links cuidadosamente. Espero que isso ajude.

    
por 21.10.2011 / 18:11
0

link

Depois de compactar uma tabela com myisampack, você deve usar myisamchk -rq para reconstruir seus índices.

Mas eu não sei se você precisa fazer isso. Os índices devem ser atualizados automaticamente.

    
por 02.08.2010 / 21:12
0

Eu tive problemas semelhantes, e nos "velhos tempos" do Sql Server, eu mudaria as consultas para Select com NOLOCK ().

Eu resolvi esse problema nos procedimentos armazenados do MySQL usando:

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;

-- execute select command here such as (this works in stored procs as well): 

SELECT LAST_NAME FROM TEMP WHERE NAME LIKE 'SMITH%' ;

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ;

-Clark Vera

    
por 27.12.2013 / 21:58