Il modo di ottimizzare InnoDB è incentrato
- Pool di buffer InnoDB: memorizza nella cache pagine di dati e pagine di indice. La quantità di dati e indici che è possibile memorizzare nella cache non è una funzione dei vincoli di spazio su disco, ma una funzione della memoria disponibile e dello spazio su disco attualmente utilizzati da InnoDB.
- MetaData InnoDB: per impostazione predefinita, il file ibdata1 normalmente contiene qualsiasi cosa InnoDB. Ciò include pagine di dati, pagine di indice, metadati di tabella, dati MVCC .
Ecco una formula che ho usato negli ultimi 5 anni per calcolare il pool di buffer InnoDB in base allo spazio su disco utilizzato dai dati InnoDB e dalle pagine di indice :
SELECT CONCAT(ROUND(KBS/POWER(1024,IF(Power1024<0,0,
IF(Power1024>3,0,Power1024)))+0.49999),SUBSTR(' KMG',IF(Power1024<0,0,
IF(Power1024>3,0,Power1024))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,(SELECT 2 Power1024) B;
- Utilizzare (SELEZIONA 0 Potenza 1024) per Byte
- Utilizzare (SELEZIONA 1 Power1024) per KB
- Utilizzare (SELEZIONA 2 Power1024) per MB
- Utilizzare (SELEZIONA 3 Power1024) per GB
- Usa (SELEZIONA 4 Power1024) per TB (Inviami un'e-mail se hai TerraBytes di RAM)
Naturalmente, ho detto una funzione di memoria disponibile e spazio su disco attualmente utilizzata da InnoDB. Da qui, basta usare il buon senso. Il numero consigliato dalla query sopra NON DOVREBBE SUPERARE IL 75% DI RAM INSTALLATA !!! Questa è la regola empirica più semplice per il dimensionamento del pool di buffer InnoDB.
Dovresti anche impostare innodb_flush_method su O_DIRECT poiché fornirà scritture sincrone stabili di InnoDB. Ho anche scritto un post su come ottimizzare l'archiviazione su disco per InnoDB .
Per quanto riguarda il messaggio La tabella non supporta l'ottimizzazione, facendo invece ricreare + analizza , il motivo per cui si ottiene quel messaggio di errore è il fatto che il motore di archiviazione è InnoDB. Meccanicamente, OPTIMIZE TABLE copia semplicemente la tabella in una tabella temporanea ed esegue ANALYZE TABLE .
In realtà, ANALYZE TABLE contro InnoDB è completamente inutile. Anche se hai eseguito ANALYZE TABLE su una tabella InnoDB, il motore di archiviazione InnoDB esegue ripetutamente immersioni nell'indice per approssimazioni di cardinalità, eliminando così le statistiche appena compilate. In effetti, Percona ha eseguito alcuni test su ANALYZE TABLE e ha raggiunto anche la stessa conclusione .
Ecco altri post che ho pubblicato nel corso dell'anno su InnoDB Tuning