sql >> Base de Datos >  >> RDS >> Mysql

Unión de tablas InnoDB con tablas MyISAM

Lo que me llama la atención de inmediato es MyISAM .

ASPECTO #1:El propio JOIN

Siempre que haya uniones que involucren a MyISAM e InnoDB, las tablas de InnoDB terminarán teniendo un comportamiento de bloqueo a nivel de tabla en lugar de bloqueo a nivel de fila debido a la participación de MyISAM en la consulta y MVCC no se puede aplicar a los datos de MyISAM. MVCC ni siquiera se puede aplicar a InnoDB en algunos casos.

ASPECTO #2:Participación de MyISAM

Desde otra perspectiva, si alguna tabla MyISAM se actualiza a través de INSERCIONES, ACTUALIZACIONES o ELIMINACIONES, las tablas MyISAM involucradas en una consulta JOIN se bloquearían desde otras conexiones de base de datos y la consulta JOIN tiene que esperar hasta que se puedan leer las tablas MyISAM. Desafortunadamente, si hay una combinación de InnoDB y MyISAM en la consulta JOIN, las tablas de InnoDB tendrían que experimentar un bloqueo intermitente como sus socios MyISAM en la consulta JOIN debido a que se retrasó la escritura.

Tenga en cuenta que MVCC aún permitirá que las transacciones READ-UNCOMMITTED y REPEATABLE-READ funcionen bien y permita que ciertas vistas de los datos estén disponibles para otras transacciones. No puedo decir lo mismo de READ-COMMITTED y SERIALIZABLE .

ASPECTO #3:Optimizador de consultas

MySQL se basa en la cardinalidad del índice para determinar un plan EXPLAIN optimizado. La cardinalidad del índice es estable en las tablas MyISAM hasta que ocurren muchas INSERCIONES, ACTUALIZACIONES y ELIMINACIONES en la tabla, por lo que podría ejecutar periódicamente OPTIMIZE TABLE contra las tablas MyISAM. ¡La cardinalidad del índice InnoDB NUNCA ES ESTABLE! Si ejecuta SHOW INDEXES FROM *innodbtable*; , verá que la cardinalidad del índice cambia cada vez que ejecuta ese comando. Eso es porque InnoDB hará inmersiones en el índice para estimar la cardinalidad. Incluso si ejecuta OPTIMIZE TABLE contra una tabla InnoDB, eso solo desfragmentará la tabla. OPTIMIZE TABLE ejecutará ANALYZE TABLE internamente para generar estadísticas de índice contra la tabla. Eso funciona para MyISAM. InnoDB lo ignora.

Mi consejo para usted es hacer todo lo posible y convertir todo a InnoDB y optimizar su configuración en consecuencia.

ACTUALIZACIÓN 2012-12-18 15:56 EDT

Lo crea o no, hay todavía hay un ticket abierto para unirse a InnoDB/MyISAM durante una SELECCIÓN PARA ACTUALIZAR . Si lo lees, resume la resolución de la siguiente manera:NO LO HAGAS !!! .