Drupal database innodb o MyISAM?


10

Ho un sito Drupal e sto soffrendo problemi di prestazioni. Ho trovato Come posso convertire un database da MyISAM a InnoDB? indicando che le prestazioni possono migliorare cambiando.

Come posso sapere se il mio database MySQL è InnoDB o MyISAM?


1
Il tipo di tabella non è associato al catalogo. Puoi avere un catalogo con un mix di tabelle MyISAM e InnoDB.
mpdonadio

2
Mentre ci sono vantaggi per le ottimizzazioni a quel livello, dubito fortemente che cambiare i tipi di tabella risolverà i problemi di prestazioni. La differenza non è poi così grande.
Letharion,

1
@ Chris J. Lee, è corretto. I tipi di tabelle di miscelazione possono essere utilizzati per motivi di prestazioni o per sfruttare le funzionalità disponibili solo per un tipo di tabella particolare (ad esempio, ricerca FULLTEXT con tabelle MyISAM). Può anche accadere per caso se si modificano le impostazioni predefinite di mysqld e si creano più tabelle in un catalogo :)
mpdonadio

2
Letharion: questo è semplicemente errato. I tipi di tabella e il modo in cui mysql è configurato per loro hanno un impatto enorme sulle prestazioni!
Walter Heck,

2
@Letharion: infatti, tralasciando i miglioramenti dell'architettura, enormi guadagni in termini di prestazioni nel caso di concorrenza con SELECT e UPDATE misti - un UPDATE bloccherà una tabella in MyISAM, ma solo una riga in InnoDB - significa che enormi aumenti delle prestazioni possono essere visto con nient'altro che cambiare il motore di un tavolo. Ora, se stai eseguendo una query stupida, stai facendo una query stupida e la modifica dei tipi di tabella non sarà di aiuto. Ma respingere il cambio dei motori fuori mano è altrettanto errato.
BMDan,

Risposte:


8

È possibile eseguire una query personalizzata:

SELECT TABLE_NAME, ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'database_name'

per elencare tutte le tabelle nel database e il motore in uso per ciascuna.

In alternativa puoi accedere al tuo database usando phpMyAdmin e selezionare il tuo database ... vedrai il motore nella Typecolonna nell'elenco delle tabelle.

Personalmente consiglierei Navicat per MySQL , è una GUI MySQL molto bella e rende molto semplice scoprire cose come questa.

Fonte: http://www.electrictoolbox.com/mysql-table-storage-engine/


Il vecchio strumento MySQL Administrator funziona bene anche per cose come questa. Se cerchi sul sito Web MySQL puoi ancora trovare il programma di installazione.
mpdonadio

@MPD Che succede ancora? Devo scaricarlo anche se solo per un po 'di nostalgia :)
Clive

L'amministratore e il browser delle query ora sono ufficialmente deprecati e non supportati, ma puoi comunque scaricarli. Odio Workbench e li uso ancora.
mpdonadio

Per vedere un output simile a quello che hai visto in phpMyAdmin dalla riga di comando, usa SHOW TABLE STATUS. Per ottenere un semplice conteggio di quante tabelle ci sono in ciascun tipo di motore, lo è SELECT ENGINE,COUNT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA='database_name' GROUP BY ENGINE.
BMDan,

6

La mia migliore esperienza è stata quella di decidere in base al tavolo. InnoDB è utile, perché può evitare il blocco delle tabelle (nessun altro processo può leggere da una tabella mentre un processo scrive), ma si comporta terribilmente con COUNT () che viene spesso utilizzato per le query sul pager.

(Modifica: vedere il commento di Clives di seguito)

Ci sono anche implicazioni sulla tua configurazione MySQL, a seconda del DB che stai utilizzando. Se hai accesso al server, mysqltuner dovrebbe essere il tuo primo passo, per verificare la configurazione:

https://github.com/rackerhacker/MySQLTuner-perl#readme


2
+1 Non sapevo che InnoDB fosse lento per le COUNTquery, secondo questo articolo dell'ex manager del gruppo ad alte prestazioni per MySQL sebbene influisca solo su una query contenente COUNT(*) senza una WHEREclausola.
Clive

3
Il motivo è che MyISAM mantiene un valore per tabella per il numero di righe nella tabella, il che significa che un semplice SELECT COUNT(*) FROM tablepuò tornare istantaneamente con quel valore. InnoDB no, quindi deve scansionare l'intero indice della chiave primaria. Detto questo, mentre Drupal fa molto SELECT COUNT(*), posso solo pensare a un posto nell'intero codice che lo fa senza una WHEREclausola. Pertanto, non utilizzare MyISAM per preoccupazione per questo particolare edgecase. InnoDB con un pool buffer di dimensioni decenti sarà più veloce per tutte le query del mondo reale.
BMDan,

6

Il solo tentativo di ottenere un sito Web più veloce è come cambiare ciecamente le auto e sperare che tu ne abbia una più veloce la prossima volta.

Per prima cosa prova i frutti bassi, se non aiuta, prova a trovare il vero collo di bottiglia.

  1. Hai attivato i meccanismi integrati: memorizzazione nella cache delle pagine (efficace solo per utenti anonimi), associazione CSS e JS?
  2. Se il tuo host offre una cache del codice operativo come APC, attivala.
  3. Configura Drupal localmente, incluso il DB completo.
  4. Assicurati di avere XDebug in esecuzione.
  5. Inizia a creare profili di prestazioni reali. In questo modo puoi identificare quale parte del tuo sito Web richiede molto tempo. Più lento è il tuo sito Web, più facile è trovare il codice / componente colpevole.

Spesso è solo una query DB lenta che richiede un indice o un modulo che fa le cose in modo lento.

Ho anche scoperto grandi differenze tra gli hoster. Se installi un drupal nuovo fuori dalla scatola, le prestazioni sono ok? In caso contrario, è tempo di cercare un altro hoster.


5

FWIW il nostro sito Drupal 6.x con nodo quasi 20K presentava alcuni problemi di prestazioni e ho scelto di spostare tutti i tavoli su InnoDB. È stato facile e il modo in cui l'ho gestito è stato usare mysqldump per scaricare tutto il contenuto in un file sql, usare un editor (sed) per sostituire tutte le occorrenze di MyISAM in InnoDB, quindi ricaricare il database da quel file. Uno dei lati negativi è che non è possibile recuperare spazio da un database InnoDB (IIRC) ma finché si mantengono le tabelle duplicate in un DB separato non si dovrebbero avere problemi. Oh, e abbiamo visto un significativo aumento delle prestazioni. E poiché abbiamo quattro istanze di Drupal, il semplice numero di file di tabella è stato eliminato dal file system (sì, sono contenuti all'interno del file InnoDB stesso). Questo è il mio valore di $ 0,02.


2
Avere un unico tablespace InnoDB può farti risparmiare inode, ma (come dici tu stesso) a scapito dello spazio su disco. Anche se si eliminano molti dati, non sarà possibile recuperare lo spazio su disco. Ciò comporta anche file di backup di grandi dimensioni non necessari e impossibile ripristinare singole tabelle. Ecco perché preferisco usare l' innodb_file_per_tableopzione.
geewiz,

1
Inoltre, è possibile convertire le tabelle sul posto: for tbl in $(mysql -Ne 'show tables' databasename); do mysql -e "ALTER TABLE $tbl ENGINE=InnoDB"; done. Aggiungi le opzioni appropriate ( -uroot -psomepassad esempio) alle due mysqlse necessario.
BMDan,

5

Solo un avviso. Se sei su Drupal 6, puoi installare il modulo DBTuner ; può facilmente spostare i tuoi tavoli da MyISAM a InnoDB. Quindi sì, c'è un modulo per quello!

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.