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

Hvorfor er MySQL's data_free større end data og indekser tilsammen?

Jeg antager, at du bruger InnoDB, fordi det er standardlagringsmotoren i MySQL 5.5.

InnoDB-tablespaces vokser, efterhånden som du indsætter data, men filerne krymper ikke, når du sletter data. Så hvis du for eksempel indsætter 1 million rækker, og derefter sletter dem, vil filen have en masse plads, der er fysisk allokeret, men ikke længere bruges. InnoDB vil genbruge pladsen, hvis den kan, før tablespace-filen vokser igen.

Også selvom du ikke sletter, kan der være noget "spildt" plads, fordi når tablespace-filer øges i størrelse, udvides de med en stor del af sider, bestemt af indstillingsmuligheden innodb_autoextend_increment i megabyte. Indtil disse sider er fyldt med data, er de ledig plads.

Data_free rapporteret af InnoDB er mængden af ​​"spildt" plads på tomme sider i den centrale tablespace-fil. Det har intet at gøre med NULL-værdier, det har at gøre med datasider, der ikke har rækker i dem.

Yderligere, i MySQL 5.5 er standarden, at alle tabeller deler ét centralt tablespace kaldet ibdata . Data_Free for alle tabeller i dette tablespace vil rapportere det samme tal, som er mængden af ​​plads på ledige sider i hele tablespacet, ikke kun for én tabel.

Du kan også tildele et separat tablespace pr. tabel (innodb_file_per_table=1 ), og for tabeller i separate tablespaces vil du se en anden værdi pr. tabel for data_free.

Data_free rapporterer kun plads efterladt af helt tomme omfang (et omfang er en blok af sider svarende til 1 MB). Du vil bemærke, at data_free altid er et multiplum af 1 MB. Mindre blokke af gratis sider tælles ikke i data_free, og det er heller ikke delvist udfyldte sider. Så den "spildte" plads er nok meget større, men vi har ingen mulighed for at vide det.




  1. Databasedesign:objekter med forskellige attributter

  2. MySQL Atomic UPDATE i InnoDB vs MyISAM

  3. Kan MySQL FIND_IN_SET eller tilsvarende fås til at bruge indekser?

  4. VS 2019 og MySQL Entity Framework duplikatdatabasenavn