Quali tabelle dovrebbero o potrebbero essere migrate su InnoDB e quali dovrebbero rimanere MyISAM?


10

Come da titolo: esiste un breve elenco di candidati per la migrazione dei tavoli a InnoDB? E cosa dovrebbe rimanere MyISAM.

Alcune informazioni aggiuntive

  • Il sito ha un carico di lettura piuttosto pesante, ma inserisce circa 10 nodi all'ora, con tag e simili.
  • Facciamo un forte uso di CCK (un'enorme quantità di tabelle normalizzate sotto forma di content_field%).
  • Utilizziamo anche le visualizzazioni per circa tutti i nostri blocchi e pagine; ma molti di questi sono candidati alla sostituzione con moduli personalizzati (per ridurre le query del database e la pesantezza di tali query).
  • Gli utenti sono tutti anonimi; ad eccezione di alcuni editor e webmaster registrati.

È divertente che l'intera Internet non abbia idea di come rispondere effettivamente a questa domanda. Quali tabelle Drupal prendono la maggior parte delle scritture e si bloccano .... chi lo sa.
JM Becker,

Risposte:


8

È necessario convertire tutti i dati in InnoDB per evitare problemi di blocco della tabella. Tuttavia, ecco alcune cose a cui pensare:

Indicizzazione FULLTEXT

Al momento, solo MyISAM supporta l'indicizzazione FULLTEXT. L'indicizzazione FULLTEXT per InnoDB è attualmente in lavorazione per MySQL 5.6 ma non è pronta per la produzione . Se hai delle tabelle Drupal che hanno indici FULLTEXT, al momento non possono essere convertite in InnoDB.

AGGIORNAMENTO su indicizzazione FULLTEXT

MySQL 5.6 è ora GA (fuori produzione). Prova l'indicizzazione FULLTEXT in InnoDB.

Per individuare quelle tabelle che hanno un FULLTEXTindice, eseguire questa query:

SELECT table_schema,table_name
FROM information_schema.statistics
WHERE index_type='FULLTEXT';

Se nessuna riga ritorna, converti tutte le tabelle InnoDB nel contenuto del tuo cuore. Ho scritto un post precedente su come convertire tutte le tabelle MyISAM in InnoDB usando solo mysql .

Replica MySQL

Se si dispone di un ambiente pesante, le letture possono andare più velocemente in MyISAM se si procede come segue:

  • Configurazione della replica master / slave
  • Crea uno o più Slave di lettura sotto il Master
  • Aggiungi --skip-innodbin /etc/my.cnf su tutti gli Slave (converte le tabelle in MyISAM durante il caricamento dei dati nello Slave)
  • Cambia il formato di riga di tutte le tabelle MyISAM su ogni Slave in FISSO con questo comando: ALTER TABLE tblname ROW_FORMAT=FIXED;
  • Ho pubblicato qualcosa al riguardo in StackExchange DBA
  • Il libro MySQL Database Design and Tuning consiglia di utilizzarlo ROW_FORMAT=FIXEDalle pagine 72,73. Ciò convertirà internamente tutti i campi VARCHAR in CHAR. Renderà la tabella MyISAM più grande, ma i SELECT eseguiti su di essa saranno molto più veloci. Posso attestarlo personalmente. Una volta avevo un tavolo da 1,9 GB. Ho cambiato il formato con ALTER TABLE tblname ROW_FORMAT=FIXED. Il tavolo è arrivato a 3,7 GB. La velocità dei SELECT contro di essa era del 20-25% più veloce senza migliorare o cambiare nient'altro.

L'unico mal di testa è rendere la tua applicazione consapevole degli slave di lettura separati.

EPILOGO

Se stai cercando altri vantaggi per ogni motore di archiviazione, controlla DBA StackExchange:


4

Dal momento che il tuo sito web è piuttosto pesante, semplicemente converto tutte le tabelle in InnoDB. Sarai quindi in grado di ottimizzare le prestazioni di lettura dimensionando il pool di buffer InnoDB e la cache delle query in modo appropriato. In questo modo, stiamo ottenendo diverse migliaia di query al secondo sui server di database dedicati nella nostra infrastruttura di hosting Drupal.

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.