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