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?
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?
Risposte:
È 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 Type
colonna 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/
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
.
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:
COUNT
query, secondo questo articolo dell'ex manager del gruppo ad alte prestazioni per MySQL sebbene influisca solo su una query contenente COUNT(*)
senza una WHERE
clausola.
SELECT COUNT(*) FROM table
può 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 WHERE
clausola. 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.
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.
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.
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.
innodb_file_per_table
opzione.
for tbl in $(mysql -Ne 'show tables' databasename); do mysql -e "ALTER TABLE $tbl ENGINE=InnoDB"; done
. Aggiungi le opzioni appropriate ( -uroot -psomepass
ad esempio) alle due mysql
se necessario.
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!