Nee, MySQL slaat niet noodzakelijkerwijs elke tabel in één afzonderlijk bestand op. De manier waarop MySQL tabellen opslaat, is afhankelijk van de gebruikte opslagengine.
Hier volgt een overzicht van hoe verschillende opslagengines omgaan met tabelopslag:
1. InnoDB (Meest gebruikelijk - de standaard vanaf MySQL 5.5)
* `innodb_file_per_table` configuratie: Deze instelling bepaalt hoe InnoDB tabelgegevens en indexen opslaat.
* `innodb_file_per_table=ON` (Aanbevolen): Elke tabel heeft zijn eigen `.ibd`-bestand voor gegevens en indexen. Metagegevens (tabeldefinitie) worden nog steeds opgeslagen in het gedeelde `ibdata1`-bestand. Dit is de voorkeursinstelling omdat:
* Het maakt de bewerkingen 'DROP TABLE', 'TRUNCATE TABLE' en 'OPTIMIZE TABLE' sneller.
* Het zorgt voor eenvoudiger herstel van individuele tabellen.
* Het vermindert het risico op corruptie bij meerdere tabellen.
* Het maakt ruimte vrij wanneer een tabel wordt verwijderd (in tegenstelling tot de gedeelde tabelruimtebenadering).
* `innodb_file_per_table=OFF` (niet aanbevolen): Gegevens en indexen voor alle InnoDB-tabellen worden opgeslagen in een gedeelde tabelruimte (meestal `ibdata1`). Metagegevens (tabeldefinitie) worden nog steeds opgeslagen in het gedeelde `ibdata1`-bestand. Deze instelling wordt sterk afgeraden, tenzij u een zeer specifieke en dwingende reden heeft om deze te gebruiken. Het is moeilijker om de tabelruimte te beheren, herstellen en verkleinen.
* `.frm`-bestanden: InnoDB maakt voor elke tabel ook een `.frm`-bestand aan. Dit bestand bevat de metadata van de tabel (tabeldefinitie). Dit is een historisch artefact en `.frm`-bestanden worden minder belangrijk omdat metagegevens worden verplaatst naar de datadictionary die rechtstreeks door de server wordt beheerd.
2. MyISAM (oudere engine, nu minder gebruikelijk):
* MyISAM slaat elke tabel op in drie afzonderlijke bestanden:
* `.frm`:Tabeldefinitie (zoals InnoDB).
* `.MYD`:Gegevensbestand (bevat de gegevens van de tabel).
* `.MYI`:Indexbestand (bevat de indexen van de tabel).
3. Andere opslagengines:
* Andere opslagmotoren (bijv. Geheugen, Archief, CSV) hebben hun eigen opslagmechanismen. De 'Memory'-engine slaat bijvoorbeeld tabellen op in het geheugen, niet op schijf. De `CSV`-engine slaat gegevens op in CSV-bestanden.
Belangrijke overwegingen:
* Locatie van bestanden: De bestanden die aan een tabel zijn gekoppeld (bijvoorbeeld `.ibd`, `.frm`, `.MYD`, `.MYI`) worden doorgaans opgeslagen in een directory die overeenkomt met de databasenaam. De locatie van deze mappen wordt bepaald door de configuratievariabele `datadir` in uw MySQL-serverconfiguratie (meestal `my.cnf` of `my.ini`).
* Gedeelde tabelruimte (ibdata1): Als u `innodb_file_per_table=OFF` gebruikt met InnoDB, delen *alle* InnoDB-tabellen het `ibdata1`-bestand (en mogelijk andere `ibdata`-bestanden als dit te groot wordt). Dit kan leiden tot fragmentatie en het moeilijk maken om schijfruimte terug te winnen.
* Metagegevensopslag: Hoewel de primaire gegevens vaak in verschillende bestanden worden gescheiden (vooral met `innodb_file_per_table=ON`), worden de tabel *definities* (metagegevens) opgeslagen in een datadictionary dat wordt beheerd door de server. `.frm`-bestanden worden gebruikt voor oudere formaten en zijn nu minder kritisch.
Hoe `innodb_file_per_table` te controleren:
U kunt de huidige instelling van `innodb_file_per_table` controleren met behulp van de volgende SQL-query:
```sql
TOON VARIABELEN ZOALS 'innodb_file_per_table';
```
Samengevat:
Terwijl oudere opslagengines zoals MyISAM *do* tabelgegevens, indexen en definities in afzonderlijke bestanden opslaan, slaat InnoDB (de meest voorkomende engine) met `innodb_file_per_table=ON` gegevens en indexen op in één `.ibd`-bestand *per tabel* (plus het oudere `.frm`-bestand voor metagegevens). Met `innodb_file_per_table=OFF` worden alle InnoDB-tabelgegevens en indexen opgeslagen in het gedeelde `ibdata1`-bestand. |