MySQL gebruikt een truc die voor altijd deel uitmaakt van POSIX-systemen. Het opent het tijdelijke bestand en ontkoppelt het onmiddellijk. Daarom is het niet zichtbaar in een directorylijst. Maar POSIX-systemen zoals UNIX en Linux zouden een niet-gekoppeld bestand eigenlijk niet moeten verwijderen terwijl een proces een open bestandshandle heeft. Dus zodra de query met behulp van de tijdelijke tabel is voltooid, wordt de bestandshandle gesloten, waarna het besturingssysteem het bestand automatisch verwijdert en de gebruikte opslagruimte vrijmaakt.
Dit is over het algemeen beter dan de servercode te vereisen. Denk eraan om het tijdelijke bestand te verwijderen als het klaar is. Het houdt ook rekening met het beëindigen van de thread of het crashen van mysqld. Het laat in ieder geval geen oude tijdelijke bestanden achter op je bestandssysteem.
U kunt de grootte van niet-gekoppelde bestanden bekijken met lsof -s
. Ik laat het aan jou over om voorbeelden op te zoeken van het gebruik van die opdracht (Google is hier je vriend).
Het is zeer onwaarschijnlijk dat een tijdelijk bestand uw 167 GB vrije ruimte in beslag neemt.
Of het kan zijn dat het tijdelijke bestand slechts 8 GB gebruikt, maar het kan zijn dat u 20 threads tegelijkertijd dezelfde query uitvoert. Ik heb dat een keer zien gebeuren.
Maar het is waarschijnlijker dat u een waarde heeft van tmp_table_size
dat beperkt de grootte van de tijdelijke tabel.
Als u de limiet bereikt, kunt u die configuratieoptie verhogen, hetzij als sessievariabele wanneer u deze nodig heeft, of globaal in de my.cnf
.
Maar ik zou eerst proberen de query te optimaliseren. Waarom moet het zulke grote tijdelijke tabellen maken? Kan het worden geoptimaliseerd om minder rijen te onderzoeken, of misschien helemaal geen tijdelijke tabel te maken?