sql >> Database >  >> RDS >> Mysql

InnoDB-tabellen samenvoegen met MyISAM-tabellen

Wat me meteen te binnen schiet is MyISAM .

ASPECT #1:De JOIN zelf

Wanneer er joins zijn waarbij MyISAM en InnoDB betrokken zijn, zullen InnoDB-tabellen uiteindelijk vergrendelingsgedrag op tabelniveau hebben in plaats van vergrendeling op rijniveau vanwege de betrokkenheid van MyISAM bij de query en MVCC kan niet worden toegepast op de MyISAM-gegevens. MVCC kan in sommige gevallen zelfs niet worden toegepast op InnoDB.

ASPECT #2:de betrokkenheid van MyISAM

Vanuit een ander perspectief, als MyISAM-tabellen worden bijgewerkt via INSERTs, UPDATEs of DELETEs, zouden de MyISAM-tabellen die betrokken zijn bij een JOIN-query worden vergrendeld voor andere DB Connections en moet de JOIN-query wachten tot de MyISAM-tabellen kunnen worden gelezen. Helaas, als er een combinatie is van InnoDB en MyISAM in de JOIN-query, zouden de InnoDB-tabellen een intermitterende vergrendeling moeten ervaren, zoals de MyISAM-partners in de JOIN-query, omdat ze niet kunnen schrijven.

Houd er rekening mee dat MVCC LEES-UNCOMMITTED en HERHAALBARE-LEES-transacties nog steeds goed zal laten werken en dat bepaalde weergaven van gegevens beschikbaar zijn voor andere transacties. Ik kan niet hetzelfde zeggen voor READ-COMMITTED en SERIALIZABLE .

ASPECT #3:Query Optimizer

MySQL vertrouwt op indexkardinaliteit om een ​​geoptimaliseerd EXPLAIN-plan te bepalen. Indexkardinaliteit is stabiel in MyISAM-tabellen totdat er veel INSERT's, UPDATE's en DELETE's met de tabel gebeuren, waardoor u periodiek OPTIMIZE TABLE kunt uitvoeren tegen de MyISAM-tabellen. InnoDB-indexkardinaliteit is NOOIT STABIEL !!! Als u SHOW INDEXES FROM *innodbtable*; . uitvoert , ziet u de indexkardinaliteit veranderen elke keer dat u die opdracht uitvoert. Dat komt omdat InnoDB duikt in de index om de kardinaliteit te schatten. Zelfs als u OPTIMIZE TABLE uitvoert tegen een InnoDB-tabel, die de tabel alleen defragmenteert. OPTIMIZE TABLE voert ANALYZE TABLE uit intern om indexstatistieken voor de tabel te genereren. Dat werkt voor MyISAM. InnoDB negeert het.

Mijn advies voor jou is om alles uit de kast te halen en alles naar InnoDB te converteren en je instellingen dienovereenkomstig te optimaliseren.

UPDATE 18-12-2012 15:56 EDT

Geloof het of niet, er is nog steeds een open ticket voor deelname aan InnoDB/MyISAM tijdens een SELECT FOR UPDATE . Als je het leest, vat het de resolutie als volgt samen:DOE HET NIET !!! .



  1. SQL - Vind volledig woord in tekst

  2. Hoe meerdere tekens in SQL vervangen?

  3. String op lengte afkappen, maar woorden opknippen is niet toegestaan

  4. Waarom externe sleutels gebruiken zonder actie op verwijderen of bijwerken?