Mysql
 sql >> Database >  >> RDS >> Mysql

Ricostruisci l'indice su InnoDB

Hai fatto SHOW TABLE STATUS prima e dopo il tuo drop+rebuild? Index_length cambia molto? Probabilmente nemmeno di un fattore due.

Non consiglio quasi mai di ricostruire qualcosa in InnoDB. Non ne vale la pena. Un'evidente eccezione ha a che fare con FULLTEXT indici.

Sì, il manichino ALTER ricostruirà gli indici. Così OPTIMIZE TABLE . Entrambi "deframmezzano" (in una certa misura) l'indice secondario Btrees e il principale Btree (che contiene i dati e la PRIMARY KEY ).

Le statistiche possono essere molte aggiornato in modo più economico utilizzando solo ANALYZE TABLE . Anche quello non è spesso necessario. 5.6 ha un modo molto migliore per mantenere le statistiche.

Se non stai già utilizzando innodb_file_per_table=ON , ti suggerisco di impostare quello (SET GLOBAL ... ) e fare ALTER TABLE tbl ENGINE=InnoDB; un'ultima volta.

Modifica online

Per modificare ft_* , è necessario ricostruire l'indice. Ciò implica un ALTER (o OPTIMIZE , che è implementato come ALTER ). Le versioni più recenti di MySQL hanno ALGORITHM=INPLACE che rende ALTER hanno un impatto minimo o nullo sul sistema in esecuzione. Ma ci sono dei limiti. Consulta il manuale.

Un'alternativa a un ALTER non INPLACE è pt-query-digest o gh-ost . Verifica se uno dei due funzionerà per il tuo caso.

A parte "ricostruire la tabella", puoi DROP INDEX ... e ADD INDEX ... . Ancora una volta, non so se funzionano per gli indici FT "sul posto". Ad ogni modo, perderesti l'uso di quell'indice durante il processo.