Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Unindo tabelas InnoDB com tabelas MyISAM


O que salta à vista imediatamente é MyISAM .

ASPECT #1:O próprio JOIN


Sempre que houver junções envolvendo MyISAM e InnoDB, as tabelas InnoDB acabarão tendo um comportamento de bloqueio em nível de tabela em vez de bloqueio em nível de linha devido ao envolvimento de MyISAM na consulta e MVCC não pode ser aplicado aos dados MyISAM. MVCC nem pode ser aplicado ao InnoDB em alguns casos.

ASPECT #2:Envolvimento do MyISAM


De outra perspectiva, se alguma tabela MyISAM estiver sendo atualizada por meio de INSERTs, UPDATEs ou DELETEs, as tabelas MyISAM envolvidas em uma consulta JOIN serão bloqueadas de outras conexões de banco de dados e a consulta JOIN terá que esperar até que as tabelas MyISAM possam ser lidas. Infelizmente, se houver uma mistura de InnoDB e MyISAM na consulta JOIN, as tabelas InnoDB teriam que experimentar um bloqueio intermitente como seus parceiros MyISAM na consulta JOIN por serem impedidas de gravar.

Lembre-se de que MVCC ainda permitirá que transações READ-UNCOMMITTED e REPEATABLE-READ funcionem bem e permitem que certas visualizações de dados estejam disponíveis para outras transações. Não posso dizer o mesmo para READ-COMMITTED e SERIALIZABLE .

ASPECT #3 :Otimizador de consulta


O MySQL depende da cardinalidade do índice para determinar um plano EXPLAIN otimizado. A cardinalidade do índice é estável em tabelas MyISAM até que muitos INSERTs, UPDATEs e DELETEs aconteçam na tabela, pelo qual você pode executar periodicamente OPTIMIZE TABLE contra as tabelas MyISAM. A cardinalidade do índice InnoDB NUNCA É ESTÁVEL!!! Se você executar SHOW INDEXES FROM *innodbtable*; , você verá a cardinalidade do índice mudar cada vez que executar esse comando. Isso porque o InnoDB fará mergulhos no índice para estimar a cardinalidade. Mesmo se você executar OPTIMIZE TABLE contra uma tabela InnoDB, que apenas desfragmentará a tabela. OPTIMIZE TABLE executará ANALYZE TABLE internamente para gerar estatísticas de índice em relação à tabela. Isso funciona para MyISAM. O InnoDB o ignora.

Meu conselho para você é fazer tudo e converter tudo para o InnoDB e otimizar suas configurações de acordo.

ATUALIZAÇÃO 18/12/2012 15:56 EDT


Acredite ou não, ainda existe ainda há um ticket aberto para ingressar no InnoDB/MyISAM durante um SELECT FOR UPDATE . Se você lê-lo, ele resume a resolução da seguinte forma:NÃO FAÇA ISSO !!! .