När du använder MySQL kan du märka att även om en tabell raderar mycket data, är datafilerna och indexfilerna i tabellen märkligt små. Detta beror på att MySQL lämnar många dataluckor när data tas bort (särskilt Text och BLOB), vilket tar upp det ursprungliga datautrymmet, så filstorleken ändras inte. Dessa hål kan återanvändas i framtiden när data infogas, och naturligtvis kan de finnas kvar där. Detta hål ökar inte bara lagringskostnaden, utan minskar också skanningseffektiviteten i tabellen på grund av datafragmentering.
Användningsscenarier:Om du har tagit bort en stor del av tabellen, eller om du har gjort många ändringar i en tabell med rader av variabel längd (en med VARCHAR-, BLOB- eller TEXT-kolumner), bör du använda OPTIMIZE TABLE. Raderade poster sparas i den länkade listan, och efterföljande INSERT-operationer återanvänder den gamla postplatsen. Du kan använda OPTIMIZE TABLE för att återanvända oanvänt utrymme och organisera fragment av datafiler. [När en stor mängd data raderas från ditt bibliotek kan du upptäcka att datafilstorleken inte har minskat. Detta beror på fragmenteringen som lämnas kvar i datafilen efter raderingsoperationen.
I de flesta miljöer behöver du inte köra OPTIMIZE TABLE alls. Även om du gör många uppdateringar av rader med variabel längd behöver du inte köra dem ofta, en gång i veckan eller en gång i månaden, bara för specifika tabeller.
OPTIMIZE TABLE fungerar endast för MyISAM-, BDB- och InnoDB-tabeller.
För BDB-tabeller är OPTIMIZE TABLE för närvarande mappad till ANALYZE TABLE. För InnoDB-tabeller mappas OPTIMIZE TABLE till ALTER TABLE, som bygger om tabellen. Återuppbyggnadsoperationer, uppdaterar indexstatistik och frigör oanvänt utrymme i klustrade index.
Observera: MySQL låser tabellen under körningen av OPTIMIZE TABLE.
För myisam kan du direkt använda optimeringstabellen table.name,När det är InnoDB-motorn kommer den att rapportera "Tabellen stöder inte optimera, gör recreate + analyze istället", och under normala omständigheter, om du konverterar från myisam till innodb, använder du alter table table.name engine='innodb' för att konvertera, och du kan också använda detta för optimering.Därför, när det är InnoDB-motorn, kan vi använda alter table table.name engine='innodb' istället för optimera för optimering。
För att se före- och eftereffekter kan du använda kommandot visa tabellstatus, till exempel visa tabellstatus från [databas] som '[table_name]'; Den data_free i returresultatet är lagringsutrymmet som upptas av tomrummet.
Skalskriptet som implementerar MySQL timed batchkontroll, tabellreparation och optimeringstabelloptimering är följande:
Original:
Inloggningen med hyperlänken är synlig.
Inloggningen med hyperlänken är synlig.
|