Mysql
 sql >> Base de données >  >> RDS >> Mysql

Joindre des tables InnoDB avec des tables MyISAM

Ce qui me saute immédiatement aux yeux, c'est MyISAM .

ASPECT #1 :Le JOIN lui-même

Chaque fois qu'il y a des jointures impliquant MyISAM et InnoDB, les tables InnoDB finiront par avoir un comportement de verrouillage au niveau de la table au lieu d'un verrouillage au niveau de la ligne en raison de l'implication de MyISAM dans la requête et MVCC ne peut pas être appliqué aux données MyISAM. MVCC ne peut même pas être appliqué à InnoDB dans certains cas.

ASPECT #2 :Implication de MyISAM

D'un autre point de vue, si des tables MyISAM sont mises à jour via INSERT, UPDATE ou DELETE, les tables MyISAM impliquées dans une requête JOIN seront verrouillées à partir d'autres connexions DB et la requête JOIN doit attendre que les tables MyISAM puissent être lues. Malheureusement, s'il y a un mélange d'InnoDB et de MyISAM dans la requête JOIN, les tables InnoDB devraient subir un verrouillage intermittent comme ses partenaires MyISAM dans la requête JOIN en raison d'un retard d'écriture.

Gardez à l'esprit que MVCC permettra toujours aux transactions READ-UNCOMMITTED et REPEATABLE-READ de fonctionner correctement et de laisser certaines des vues de données soient disponibles pour d'autres transactions. Je ne peux pas dire la même chose pour READ-COMMITTED et SERIALIZABLE .

ASPECT #3 :Optimiseur de requête

MySQL s'appuie sur la cardinalité des index pour déterminer un plan EXPLAIN optimisé. La cardinalité de l'index est stable dans les tables MyISAM jusqu'à ce qu'un grand nombre d'INSERTS, de UPDATE et de DELETE arrivent à la table, ce qui vous permet d'exécuter périodiquement OPTIMIZE TABLE contre les tables MyISAM. La cardinalité de l'index InnoDB n'est JAMAIS STABLE !!! Si vous exécutez SHOW INDEXES FROM *innodbtable*; , vous verrez la cardinalité de l'index changer à chaque fois que vous exécuterez cette commande. C'est parce qu'InnoDB fera des plongées dans l'index pour estimer la cardinalité. Même si vous exécutez OPTIMIZE TABLE contre une table InnoDB, cela ne fera que défragmenter la table. OPTIMIZE TABLE exécutera ANALYZE TABLE en interne pour générer des statistiques d'index sur la table. Cela fonctionne pour MyISAM. InnoDB l'ignore.

Mon conseil pour vous est de tout mettre en œuvre et de tout convertir en InnoDB et d'optimiser vos paramètres en conséquence.

MISE À JOUR 2012-12-18 15:56 HAE

Croyez-le ou non, il y a toujours un ticket ouvert pour rejoindre InnoDB/MyISAM pendant un SELECT FOR UPDATE . Si vous le lisez, il résume la résolution comme suit :NE LE FAITES PAS !!! .