sql >> Database >  >> RDS >> Mysql

Waarom is MySQL's data_free groter dan data en indexen gecombineerd?

Ik neem aan dat je InnoDB gebruikt, omdat dit de standaard opslagengine is in MySQL 5.5.

InnoDB-tabelruimten groeien als u gegevens invoegt, maar de bestanden krimpen niet wanneer u gegevens verwijdert. Dus als u bijvoorbeeld 1 miljoen rijen invoegt en ze vervolgens verwijdert, heeft het bestand veel ruimte die fysiek is toegewezen, maar niet meer wordt gebruikt. InnoDB zal die ruimte hergebruiken als het kan voordat het tablespace-bestand opnieuw groeit.

Ook als je niet verwijdert, kan er wat "verspilde" ruimte zijn, want wanneer tabelruimtebestanden groter worden, worden ze uitgebreid met een groot aantal pagina's, bepaald door de configuratieoptie innodb_autoextend_increment in megabyte. Totdat die pagina's gevuld zijn met gegevens, is het vrije ruimte.

Data_free gerapporteerd door InnoDB is de hoeveelheid ruimte "verspild" in lege pagina's in het centrale tablespace-bestand. Het heeft niets te maken met NULL-waarden, het heeft te maken met gegevenspagina's die geen rijen bevatten.

Verder is in MySQL 5.5 de standaardinstelling dat alle tabellen één centrale tabelruimte delen, genaamd ibdata . De data_Free voor alle tabellen in deze tabelruimte rapporteert hetzelfde getal, dat is de hoeveelheid ruimte in vrije pagina's in de hele tabelruimte, niet slechts voor één tabel.

U kunt ook een aparte tablespace per tabel toewijzen (innodb_file_per_table=1 ), en voor tabellen in aparte tablespaces, zie je een andere waarde per tabel voor data_free.

Data_free meldt alleen ruimte die is achtergelaten door volledig lege mate (een omvang is een blok pagina's gelijk aan 1 MB). U zult merken dat data_free altijd een veelvoud van 1 MB is. Kleinere blokken met vrije pagina's worden niet meegeteld in data_free, evenmin als gedeeltelijk gevulde pagina's. Dus de "verspilde" ruimte is waarschijnlijk een stuk groter, maar we kunnen het niet weten.




  1. Is het een slecht ontwerp om arrays in een database te gebruiken?

  2. MySQL:krijg een resultaat van een INSERT SELECT

  3. Hoe verbreek je alle huidige verbindingen met een SQL Server 2005-database?

  4. bereken de meeste gebruikers ooit online met MySQL