sql >> Databasteknik >  >> RDS >> Mysql

MySQL Row Format:Skillnad mellan fast och dynamisk?

Skillnaden spelar egentligen bara roll för MyISAM, andra lagringsmotorer bryr sig inte om skillnaden.EDIT : Många användare kommenterade att InnoDB bryr sig:länk 1 av ångdriven , länk 2 av Kaan .

Med MyISAM med fast bredd rader finns det några fördelar:

  1. Ingen radfragmentering:Det är möjligt med rader med variabel bredd att få enstaka rader uppdelade i flera sektioner över datafilen. Detta kan öka disksökningar och sakta ner operationer. Det är möjligt att defragmentera den med OPTIMIZE TABLE, men det är inte alltid praktiskt.

  2. Datafilpekarestorlek:I MyISAM finns det ett koncept med en datafilpekare som används när den behöver referera till datafilen. Detta används till exempel i index när de refererar till var raden faktiskt finns. Med fasta breddstorlekar baseras denna pekare på radförskjutningen i filen (dvs. rader är 1, 2, 3 oavsett storlek). Med variabel bredd baseras pekaren på byteoffset (dvs. rader kan vara 1, 57, 163). Resultatet är att med stora tabeller måste pekaren vara större, vilket då potentiellt lägger till mycket mer overhead till tabellen.

  3. Lättare att åtgärda vid korruption. Eftersom varje rad har samma storlek, om din MyISAM-tabell blir skadad är den mycket lättare att reparera, så du kommer bara att förlora data som faktiskt är skadad. Med variabel bredd är det i teorin möjligt att pekarna för variabel bredd blir trassliga, vilket kan resultera i att data spolas på ett dåligt sätt.

Nu är den primära nackdelen med fast bredd att den slösar mer utrymme. Du måste till exempel använda CHAR-fält istället för VARCHAR-fält, så att du får extra utrymme som tas upp.

Normalt har du inte så mycket val i formatet, eftersom det dikteras utifrån schemat. Det kan dock vara värt om du bara har några få varchar eller en enda blob/text för att försöka optimera mot detta. Överväg till exempel att byta ut den enda varcharen till en röding, eller dela upp klumpen i en egen tabell.

Du kan läsa ännu mer om detta på:

http://dev.mysql.com/doc/refman /5.0/en/static-format.html

http://dev.mysql.com/doc/refman /5.0/sv/dynamic-format.html



  1. Visar mysql-data i html-tabellen PHP

  2. Vad är det bästa sättet att paginera resultat i SQL Server

  3. Varför kan det bara finnas en TIMESTAMP-kolumn med CURRENT_TIMESTAMP i DEFAULT-satsen?

  4. Hur får man Django att fungera med MySQL-drivrutiner som inte stöds såsom gevent-mysql eller Concurrences MySQL-drivrutin?