sql >> Database >  >> RDS >> Mysql

Moeten VARCHAR-kolommen aan het einde van tabeldefinities in MySQL worden geplaatst?

Het stellen van die vraag over "MySQL" is niet nuttig, aangezien MySQL opslag delegeert aan opslagengines en zij opslag op zeer verschillende manieren implementeren. Het is logisch om deze vraag voor elke individuele opslagengine te stellen.

In de MEMORY-engine bestaan ​​gegevenstypen met variabele lengte niet. Een VARCHAR wordt stilzwijgend veranderd in een CHAR. In de context van uw vraag:het maakt niet uit waar in een tabeldefinitie u uw VARCHAR plaatst.

Als een tabel in de MyISAM-engine geen enkele gegevens met variabele lengte heeft (VARCHAR, VARBINARY of een willekeurig TEXT- of BLOB-type), is het van de VASTE variant van MyISAM, dat wil zeggen dat records een vaste bytelengte hebben. Dit kan gevolgen hebben voor de prestaties, vooral als gegevens herhaaldelijk worden verwijderd en ingevoegd (d.w.z. de tabel wordt niet alleen toegevoegd). Zodra een gegevenstype met variabele lengte deel uitmaakt van een tabeldefinitie, wordt het de DYNAMISCHE variant van MyISAM, en MyISAM verandert intern elk behalve het kortste CHAR-type intern in VARCHAR. Nogmaals, de positie en zelfs de definitie van CHAR/VARCHAR doen er niet toe.

In de InnoDB-engine worden gegevens opgeslagen in pagina's van 16 KB groot. Een pagina heeft een paginavoettekst met een checksum en een paginakoptekst met onder andere een paginadirectory. De paginamap bevat voor elke rij de offset van die rij ten opzichte van het begin van de pagina. Een pagina bevat ook vrije ruimte en alle I/O wordt gedaan in pagina's.

Daarom kan InnoDB, zolang er vrije ruimte op een pagina is, VARCHAR op zijn plaats laten groeien en rijen binnen een pagina verplaatsen, zonder extra I/O te veroorzaken. Omdat alle rijen worden geadresseerd als (paginanummer, vermelding in de paginadirectory), wordt de verplaatsing van een rij binnen een pagina gelokaliseerd op de pagina en niet zichtbaar van buitenaf.

Het betekent ook dat ook voor InnoDB de volgorde van kolommen in een rij er helemaal niet toe doet.

Dit zijn de drie opslagengines die het meest worden gebruikt met MySQL, en de volgorde van de kolommen maakt voor geen van deze drie uit. Het kan zijn dat er andere, meer exotische opslag-engines bestaan ​​waarvoor dit niet waar is.



  1. Alleen de datum retourneren van een SQL Server DateTime-gegevenstype

  2. php probleem met meerdere databases

  3. Foreign Key toevoegen mislukt in MySQL met foutcode 1005, nummer 150

  4. MySQL longtext analoog in Microsoft SQL?