MyISAM per letture di dati


10

Ho una tabella con circa 1 miliardo di righe e il 98% di lettura intensiva.

Ho provato a ottimizzare il database, con diversi motori di archiviazione (MyISAM e InnoDB)

Quindi ha eseguito alcuni test per visualizzare le prestazioni

Nella clausola where avevo un ID chiave principale e sembrava che, dal momento che gli archivi di MyISAM Key Cache caricassero tutto l'indice nel suo buffer, l'utilizzo di MyISAM sembrava essere abbastanza veloce, circa 2 volte più veloce di InnoDB

Ma per InnoDB, sembrava più lento !! InnoDB non utilizza alcun buffer per precaricare gli indici?


forse qualcuno dei trigger felici moderatori che votano per chiudere la domanda può elaborare le loro motivazioni?
pQd

Puoi darci qualche idea delle dimensioni del database e della tabella in questione? La dimensione totale su disco sarebbe utile. Inoltre, quali specifiche è la macchina su cui stai eseguendo?
Dave Rix,

Risposte:


6

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 Iin 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 DELETEseUPDATEs
  • 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?


innodbe genera davvero delle letture del disco quando tutti i dati sono già nel pool di buffer e non ci sono richieste di modifica dei dati simultanee, legge solo?
pQd

Suppongo che, poiché il richiedente ha 1 miliardo di righe nel suo db, è improbabile che abbia tutto nella cache nella RAM nel pool di buffer - quindi ci saranno letture necessarie per accedere ai dati al di fuori del pool di buffer e sul disco?
Dave Rix,

3

MyISAM funzionerà sempre molto più velocemente di innodb quando non c'è contesa per i dati. Inizia ad aggiungere più sessioni cercando di aggiornare lo stesso tablse e innodb ottiene molto rapidamente il vantaggio in termini di prestazioni.

La modalità di messa a punto del sistema per i 2 motori è molto diversa.

Il motivo per cui esistono diversi motori è perché esistono diversi carichi di lavoro / modelli di accesso.


2

devi "riscaldare" innodb. ad esempio riproducendo nuovamente i registri di accesso o eseguendo alcune query intelligenti che toccheranno ciascun valore dall'indice.

dai un'occhiata qui o qui .

spero che tu non usi le impostazioni mysql predefinite per innodb - erano adatte all'hardware da ~ 2000.


Ho apportato modifiche alla configurazione predefinita, ho anche eseguito la query più volte, circa 30 volte, ma ho prodotto quasi gli stessi risultati. È stato più veloce dopo alcuni tentativi, ma è rimasto più lento di MYISAM, inoltre ha utilizzato MariaDB (ultima versione)
Akash


0

Dopo aver ulteriormente ottimizzato InnoDB su MariaDB, ho aumentato la innodb_buffer_pool_sizedimensione del mio database InnoDB, da quando InnoDB ha iniziato a recuperare le righe più velocemente

Suppongo che l'ottimizzazione di InnoDB sia abbastanza importante in base alle esigenze del database

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.