Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verbinden von InnoDB-Tabellen mit MyISAM-Tabellen

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.

Denken Sie daran, dass MVCC weiterhin READ-UNCOMMITTED- und REPEATABLE-READ-Transaktionen zulassen wird, damit sie einwandfrei funktionieren und bestimmte Transaktionen zulassen Datenansichten für andere Transaktionen verfügbar sein. Ich kann nicht dasselbe für READ-COMMITTED und SERIALIZABLE sagen .

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