Mysql
 sql >> Database >  >> RDS >> Mysql

Unire le tabelle InnoDB con le tabelle MyISAM

Quello che mi salta subito all'occhio è MyISAM .

ASPETTO #1:Il JOIN stesso

Ogni volta che ci sono join che coinvolgono MyISAM e InnoDB, le tabelle InnoDB finiranno per avere un comportamento di blocco a livello di tabella invece del blocco a livello di riga a causa del coinvolgimento di MyISAM nella query e MVCC non può essere applicato ai dati MyISAM. MVCC in alcuni casi non può nemmeno essere applicato a InnoDB.

ASPETTO #2:Coinvolgimento di MyISAM

Da un'altra prospettiva, se qualsiasi tabella MyISAM viene aggiornata tramite INSERT, UPDATE o DELETE, le tabelle MyISAM coinvolte in una query JOIN verrebbero bloccate da altre connessioni DB e la query JOIN deve attendere fino a quando le tabelle MyISAM possono essere lette. Sfortunatamente, se c'è un mix di InnoDB e MyISAM nella query JOIN, le tabelle InnoDB dovrebbero subire un blocco intermittente come i suoi partner MyISAM nella query JOIN a causa del blocco della scrittura.

Tieni presente che MVCC consentirà comunque alle transazioni READ-UNCOMMITTED e REPEATABLE-READ di funzionare correttamente e di consentire ad alcuni le visualizzazioni dei dati siano disponibili per altre transazioni. Non posso dire lo stesso per READ-COMMITTED e SERIALIZABLE .

ASPETTO #3:Strumento per ottimizzare le query

MySQL si basa sulla cardinalità dell'indice per determinare un piano EXPLAIN ottimizzato. La cardinalità dell'indice è stabile nelle tabelle MyISAM finché non si verificano molti INSERT, UPDATE e DELETE nella tabella, in base ai quali è possibile eseguire periodicamente OPTIMIZE TABLE contro i tavoli MyISAM. La cardinalità dell'indice InnoDB NON È MAI STABILE !!! Se esegui SHOW INDEXES FROM *innodbtable*; , vedrai la cardinalità dell'indice cambiare ogni volta che esegui quel comando. Questo perché InnoDB si tufferà nell'indice per stimare la cardinalità. Anche se esegui OPTIMIZE TABLE contro una tabella InnoDB, che deframmenterà solo la tabella. OPTIMIZE TABLE eseguirà ANALYZE TABLE internamente per generare statistiche sull'indice rispetto alla tabella. Funziona per MyISAM. InnoDB lo ignora.

Il mio consiglio per te è di fare di tutto e convertire tutto in InnoDB e ottimizzare le tue impostazioni di conseguenza.

AGGIORNAMENTO 18-12-2012 15:56 EDT

Che ci crediate o no, c'è ancora un ticket aperto per l'adesione a InnoDB/MyISAM durante un SELECT FOR UPDATE . Se lo leggi, riassume la risoluzione come segue:NON FARLO !!! .