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.
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 !!! .