Was mir sofort ins Auge springt ist MyISAM .
ASPEKT #1 :Der JOIN selbst
Wann immer es Joins gibt, an denen MyISAM und InnoDB beteiligt sind, werden InnoDB-Tabellen aufgrund der Beteiligung von MyISAM an der Abfrage und MVCC kann nicht auf die MyISAM-Daten angewendet werden. MVCC kann in einigen Fällen nicht einmal auf InnoDB angewendet werden.
ASPEKT 2:Beteiligung von MyISAM
Aus einer anderen Perspektive würden, wenn irgendwelche MyISAM-Tabellen über INSERTs, UPDATEs oder DELETEs aktualisiert werden, die an einer JOIN-Abfrage beteiligten MyISAM-Tabellen von anderen DB-Verbindungen gesperrt werden und die JOIN-Abfrage muss warten, bis die MyISAM-Tabellen gelesen werden können. Wenn es in der JOIN-Abfrage eine Mischung aus InnoDB und MyISAM gibt, müssten die InnoDB-Tabellen leider wie ihre MyISAM-Partner in der JOIN-Abfrage eine zeitweilige Sperre erfahren, da sie am Schreiben gehindert werden.
ASPEKT Nr. 3:Abfrageoptimierer
MySQL verlässt sich auf die Indexkardinalität, um einen optimierten EXPLAIN-Plan zu bestimmen. Die Indexkardinalität ist in MyISAM-Tabellen stabil, bis viele INSERTs, UPDATEs und DELETEs mit der Tabelle passieren, wodurch Sie regelmäßig OPTIMIZE TABLE
ausführen könnten gegen die MyISAM-Tabellen. Die InnoDB-Indexkardinalität ist NIE STABIL !!! Wenn Sie SHOW INDEXES FROM *innodbtable*;
ausführen , sehen Sie, dass sich die Indexkardinalität jedes Mal ändert, wenn Sie diesen Befehl ausführen. Das liegt daran, dass InnoDB in den Index eintaucht, um die Kardinalität zu schätzen. Auch wenn Sie OPTIMIZE TABLE
ausführen gegen eine InnoDB-Tabelle, die die Tabelle nur defragmentiert. OPTIMIZE TABLE
wird ANALYZE TABLE
ausführen intern, um Indexstatistiken für die Tabelle zu generieren. Das funktioniert für MyISAM. InnoDB ignoriert es.
Mein Rat an Sie ist, gehen Sie aufs Ganze und konvertieren Sie alles zu InnoDB und optimieren Sie Ihre Einstellungen entsprechend.
UPDATE 2012-12-18 15:56 EDT
Ob Sie es glauben oder nicht, es gibt immer noch ein offenes Ticket für den Beitritt zu InnoDB/MyISAM während eines SELECT FOR UPDATE . Wenn Sie es lesen, fasst es die Auflösung wie folgt zusammen:TU ES NICHT !!! .