sql >> Databasteknik >  >> RDS >> Mysql

Varför är MySQL:s data_free större än data och index kombinerat?

Jag antar att du använder InnoDB, eftersom det är standardlagringsmotorn i MySQL 5.5.

InnoDB-tabellutrymmen växer när du infogar data, men filerna krymper inte när du raderar data. Så om du till exempel infogar 1 miljon rader och sedan tar bort dem, kommer filen att ha mycket utrymme som är fysiskt allokerat, men som inte längre används. InnoDB kommer att återanvända det utrymmet om det kan innan tabellutrymmesfilen växer igen.

Även om du inte tar bort kan det finnas lite "bortkastat" utrymme eftersom när tabellutrymmesfiler utökas i storlek utökas de med en stor del av sidorna, bestämt av konfigurationsalternativet innodb_autoextend_increment i megabyte. Tills dessa sidor är fyllda med data är de ledigt utrymme.

Data_free rapporterat av InnoDB är mängden utrymme som "slösas bort" på tomma sidor i den centrala tabellutrymmesfilen. Det har ingenting att göra med NULL-värden, det har att göra med datasidor som inte har rader i dem.

Vidare, i MySQL 5.5, är standarden att alla tabeller delar en central tabellyta som heter ibdata . Data_Free för alla tabeller i det här tabellutrymmet kommer att rapportera samma siffra, vilket är mängden utrymme på lediga sidor i hela tabellutrymmet, inte bara för en tabell.

Du kan också tilldela ett separat tabellutrymme per tabell (innodb_file_per_table=1 ), och för tabeller i separata tabellutrymmen kommer du att se ett annat värde per tabell för data_free.

Data_free rapporterar endast utrymme som lämnats av helt tomma områden (en omfattning är ett block med sidor lika med 1 MB). Du kommer att märka att data_free alltid är en multipel av 1 MB. Mindre block med gratissidor räknas inte i data_free och inte heller delvis ifyllda sidor. Så det "slösade" utrymmet är förmodligen mycket större, men vi har ingen möjlighet att veta det.




  1. SQLException:Före start av resultatuppsättning

  2. Finns det något sätt att göra en SQL-dump från Amazon Redshift

  3. Mysql date funktion fungerar inte för mindre än

  4. Hur man ansluter Grails 3.0 till min lokala Mysql-databas