Prima di decidere su MyISAM o InnoDB dovrai esaminare entrambi i motori di archiviazione in termini di come ogni cache
MyISAM
Quando viene letto, gli indici di una tabella MyISAM possono essere letti una volta dal file .MYI e caricati nella cache delle chiavi MyISAM (in base alle dimensioni di key_buffer_size ). Come si può rendere più veloce la lettura .MYD di una tabella MyISAM? Con questo:
ALTER TABLE mytable ROW_FORMAT=Fixed;
Ho scritto di questo nei miei post precedenti
InnoDB
OK, che dire di InnoDB? InnoDB esegue I / O su disco per le query? Sorprendentemente, sì, lo fa !! Probabilmente stai pensando che io sia pazzo per averlo detto, ma è assolutamente vero, anche per le query SELECT . A questo punto, probabilmente ti starai chiedendo "In che modo InnoDB sta eseguendo l'I / O su disco per le query?"
Tutto risale al fatto che InnoDB è un motore di memorizzazione transazionale ACID- complaint. Perché InnoDB sia Transazionale, deve supportare I
in ACID
, che è Isolation. La tecnica per mantenere l'isolamento per le transazioni viene eseguita tramite MVCC, Multiversion Concurrency Control . In termini semplici, InnoDB registra l'aspetto dei dati prima che le transazioni tentino di modificarli. Dove viene registrato? Nel file del tablespace di sistema, meglio noto come ibdata1. Ciò richiede l'I / O del disco .
CONFRONTO
Poiché sia InnoDB che MyISAM eseguono l'I / O su disco, quali fattori casuali determinano chi è più veloce?
- Dimensione delle colonne
- Formato colonna
- Set di caratteri
- Intervallo di valori numerici (che richiedono INT abbastanza grandi)
- Righe suddivise in blocchi (concatenamento di file)
- Frammentazione dei dati causata da
DELETEs
eUPDATEs
- Dimensione della chiave primaria (InnoDB ha un indice cluster, che richiede due ricerche di chiavi)
- Dimensione delle voci dell'indice
- l'elenco continua ...
EPILOGO
Pertanto, in un ambiente di lettura pesante, è possibile che una tabella MyISAM con un formato di riga fissa superi le letture di InnoDB dal pool di buffer InnoDB se vi sono dati sufficienti scritti nei registri di annullamento contenuti in ibdata1 per supportare il comportamento transazionale imposto sui dati InnoDB. Pianifica i tipi di dati, le query e il motore di archiviazione in modo molto accurato. Una volta che i dati crescono, potrebbe essere molto difficile spostarli.
A proposito, ho scritto qualcosa del genere 5 giorni fa: come posso assegnare un limite di memoria per mySQL?