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