Ottimizzazione delle impostazioni predefinite di InnoDB


8

Ho guardato my.ini e ho visto varie impostazioni predefinite. Il mio database è in esecuzione su un singolo PC autonomo. Voglio ottimizzare le prestazioni di InnoDB e MySQL in generale per le prestazioni. Non vi è alcun vincolo di spazio su disco. Quali impostazioni predefinite dovrei modificare per ottimizzare per prestazioni migliori, affidabilità e possibili backup point-in-time [alta disponibilità].

Modificato

Al momento, ogni volta che eseguo "Ottimizza tabelle" tramite Manutenzione su MySQL Administrator, viene visualizzato:

La tabella non supporta l'ottimizzazione, facendo invece ricreare + analizza

su tutti i tavoli. Tutti i miei tavoli sono InnoDB, ma perché non supportano Optimize?


quella modifica merita una domanda separata, imo. Dai un'occhiata alla documentazione OPTIMIZE TABLE: dev.mysql.com/doc/refman/5.5/en/optimize-table.html InnoDB supporta il comando, ma il processo è diverso da MyISAM
Derek Downey

Risposte:


11

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


Il mio PC ha 2 GB di RAM e InnoDB_Buffer_Pool_Size è impostato di default su 6M. L'ho aumentato a 500M. Eventuali suggerimenti?
RPK,

Impostalo 1536M che è 1.5G poiché è il 75% della RAM installata
RolandoMySQLDBA

Ho eseguito la tua query e dà un output di 45G. La RAM sul mio server è 8G .. Dovrei assolutamente aumentare la mia RAM? Oppure ci sono alcune condizioni per la query sopra.
Stewie

@Stewie Se hai 45G di InnoDB, 60GB di RAM è quello che ti serve se hai il budget. Dato che hai solo 8G, il 75% della RAM installata (6G) è adeguata.
RolandoMySQLDBA il

@RolandoMySQLDBA: ottimo post! Ma non capisco bene perché nel caso di Stewie, la sua RAM sia solo di 8 GB, ma l'output della sua query può essere maggiore di 8 GB (45G in questo caso.) Potresti illuminare?
Chubaka,

3

Ecco un vecchio articolo sulle variabili importanti da "sintonizzare grossolanamente". Il più importante probabilmente èinnodb_buffer_pool_size

Consiglio vivamente l'aggiornamento a MySQL 5.5 (se non lo stai già eseguendo). Hanno apportato alcune modifiche alle prestazioni di InnoDB. Forniscono anche una sezione mainstream su come ottimizzare per InnoDB ora che è il motore predefinito: http://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb.html

Per quanto riguarda i backup temporizzati, ti consigliamo di guardare il registro binario . Le basi per abilitare questo è impostare la log-binvariabile in my.cnf


Ho eseguito l'aggiornamento a MySQL 5.5.
RPK,

2

Optimize è disponibile in molti colori.

Penso che il tuo primo passo dovrebbe essere quello di decidere cosa significa "ottimizzare" per te. Per alcune persone, significa "query SELECT più veloci". Per altri significa "miglior equilibrio tra prestazioni SELECT e prestazioni INSERT". Per altri ancora, "prestazioni INSERT più veloci".

Devi decidere quali sono i tuoi criteri e come dirai se le modifiche ti aiutano prima di iniziare la messa a punto.

Quindi metti i file di configurazione e le opzioni di avvio sotto il controllo della versione e inizia a sperimentare. Documento di cui segui i consigli e dove li hai trovati. (I consigli cambiano nel tempo, man mano che la base di codice e l'hardware cambiano.) Metti anche quei documenti sotto controllo della versione.

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.