sql >> Database >  >> RDS >> Mysql

Index opnieuw opbouwen op InnoDB

Heb je SHOW TABLE STATUS . gedaan? voor en na je drop+rebuild? Verandert Index_length veel? Waarschijnlijk nog geen factor twee.

Ik raad bijna nooit aan om iets in InnoDB opnieuw op te bouwen. Het is het niet waard. Een opvallende uitzondering heeft te maken met FULLTEXT indexen.

Ja de dummy ALTER zal de indexen opnieuw opbouwen. Zo zal OPTIMIZE TABLE . Beide zullen (tot op zekere hoogte) de secundaire index BTrees en de hoofd BTree (die de gegevens en de PRIMARY KEY bevat) "defragmenteren" ).

De statistieken kunnen veel . zijn goedkoper bijgewerkt met slechts ANALYZE TABLE . Zelfs dat is niet vaak nodig. 5.6 heeft een veel betere manier om de statistieken bij te houden.

Als u innodb_file_per_table=ON nog niet gebruikt , stel ik voor dat je dat instelt (SET GLOBAL ... ) en doe ALTER TABLE tbl ENGINE=InnoDB; nog een laatste keer.

Online wijzigen

Om ft_* te wijzigen , moet u de index opnieuw opbouwen. Dit impliceert een ALTER (of OPTIMIZE , die is geïmplementeerd als ALTER ). Nieuwere versies van MySQL hebben ALGORITHM=INPLACE waardoor ALTER hebben weinig of geen invloed op het lopende systeem. Maar er zijn beperkingen. Raadpleeg de handleiding.

Een alternatief voor een niet-INPLACE ALTER is pt-query-digest of gh-ost . Kijk of een van beide voor jouw geval werkt.

In plaats van "de tabel opnieuw opbouwen", kunt u DROP INDEX ... en ADD INDEX ... . Nogmaals, ik weet niet of deze werken voor FT-indexen "inplace". Hoe dan ook, je zou het gebruik van die index tijdens het proces verliezen.




  1. geëmuleerde voorbereide verklaringen versus echte voorbereide verklaringen

  2. Wat is MySQL's wait_timeout, net_read_timeout en net_write_timeout variabele?

  3. Yii MySql-query laten uitvoeren

  4. Laravel volgorde door heeftveel relaties