sql >> Databasteknik >  >> RDS >> Mysql

Sammanfoga InnoDB-tabeller med MyISAM-tabeller

Det som hoppar upp direkt på mig är MyISAM .

ASPECT #1 :JOIN själv

När det finns kopplingar som involverar MyISAM och InnoDB kommer InnoDB-tabeller att ha låsbeteende på tabellnivå istället för låsning på radnivå på grund av MyISAMs inblandning i frågan och MVCC kan inte tillämpas på MyISAM-data. MVCC kan inte ens tillämpas på InnoDB i vissa fall.

ASPECT #2 :MyISAMs engagemang

Ur ett annat perspektiv, om några MyISAM-tabeller uppdateras via INSERTs, UPDATEs eller DELETEs, skulle MyISAM-tabellerna som är involverade i en JOIN-fråga låsas från andra DB-anslutningar och JOIN-frågan måste vänta tills MyISAM-tabellerna kan läsas. Tyvärr, om det finns en blandning av InnoDB och MyISAM i JOIN-frågan, skulle InnoDB-tabellerna behöva uppleva ett intermittent lås som sina MyISAM-partners i JOIN-frågan på grund av att de hålls uppe från att skriva.

Tänk på att MVCC fortfarande kommer att tillåta LÄS-OENGÄNGLIGA och REPETERBAR-LÄS-transaktioner att fungera bra och låta vissa vyer av data vara tillgängliga för andra transaktioner. Jag kan inte säga detsamma för LÄS-ENGAGERAD och SERIELLISERABAR .

ASPECT #3:Query Optimizer

MySQL förlitar sig på indexkardinalitet för att fastställa en optimerad EXPLAIN-plan. Indexkardinalitet är stabil i MyISAM-tabeller tills många INSERT, UPPDATERINGAR och DELETEs händer med tabellen, genom vilka du regelbundet kan köra OPTIMIZE TABLE mot MyISAM-tabellerna. InnoDB indexkardinalitet är ALDRIG STABIL!!! Om du kör SHOW INDEXES FROM *innodbtable*; , kommer du att se indexkardinaliteten ändras varje gång du kör det kommandot. Det beror på att InnoDB kommer att dyka in i indexet för att uppskatta kardinaliteten. Även om du kör OPTIMIZE TABLE mot en InnoDB-tabell kommer det bara att defragmentera tabellen. OPTIMIZE TABLE kommer att köra ANALYZE TABLE internt för att generera indexstatistik mot tabellen. Det fungerar för MyISAM. InnoDB ignorerar det.

Mitt råd till dig är att gå all in och konvertera allt till InnoDB och optimera dina inställningar därefter.

UPPDATERING 2012-12-18 15:56 EDT

Tro det eller ej, det finns fortfarande en öppen biljett på InnoDB/MyISAM som går med under en VÄLJ FÖR UPPDATERING . Om du läser den sammanfattar den upplösningen på följande sätt:DON'T DO IT !!! .



  1. mysql sammanfoga två tabeller med kommaseparerade ID

  2. Returnera postuppsättning (virtuell tabell) från funktion

  3. Dölj dubbletter av resultat i MySQL-fråga

  4. Hur kan jag ställa in ett datum till NULL i Yii?