sql >> Database teknologi >  >> RDS >> Mysql

Skal VARCHAR-kolonner sættes i slutningen af ​​tabeldefinitioner i MySQL?

At stille det spørgsmål om "MySQL" er ikke nyttigt, da MySQL henviser storage til storage-motorer, og de implementerer storage på meget forskellige måder. Det giver mening at stille dette spørgsmål til enhver individuel lagermaskine.

I MEMORY-motoren findes datatyper med variabel længde ikke. En VARCHAR ændres lydløst til en CHAR. I forbindelse med dit spørgsmål:Det er lige meget, hvor i en tabeldefinition du placerer din VARCHAR.

I MyISAM-motoren, hvis en tabel ikke har nogen data med variabel længde overhovedet (VARCHAR, VARBINARY eller en hvilken som helst TEXT- eller BLOB-type), er den af ​​FIXED-varianten af ​​MyISAM, det vil sige, at poster har en fast byte-længde. Dette kan have præstationsimplikationer, især hvis data slettes og indsættes gentagne gange (dvs. tabellen er ikke kun tilføjet). Så snart en datatype med variabel længde er en del af en tabeldefinition, bliver den den DYNAMISKE variant af MyISAM, og MyISAM ændrer internt enhver anden end den korteste CHAR-type internt til VARCHAR. Igen, position og endda definition af CHAR/VARCHAR betyder ikke noget.

I InnoDB-motoren gemmes data på sider på 16 KB størrelse. En side har en sidefod med en kontrolsum og en sidehoved, med blandt andet en sidemappe. Sidebiblioteket indeholder for hver række forskydningen af ​​denne række i forhold til begyndelsen af ​​siden. En side indeholder også ledig plads, og al I/O foregår på sider.

Derfor kan InnoDB, så længe der er ledig plads på en side, vokse VARCHAR på plads og flytte rækker rundt inde på en side uden at pådrage sig yderligere I/O. Da alle rækker adresseres som (sidenummer, sideindeksindgang), er bevægelse af en række inde på en side lokaliseret til siden og ikke synlig udefra.

Det betyder også, at rækkefølgen af ​​kolonner inde i en række også er ligegyldig for InnoDB.

Det er de tre lagringsmotorer, der er mest almindeligt brugt med MySQL, og rækkefølgen af ​​kolonner betyder ikke noget for nogen af ​​disse tre. Det kan være, at der findes andre, mere eksotiske lagringsmotorer, for hvilke dette ikke er sandt.



  1. Sådan gemmer du en UUID som binær(16) i java

  2. PDO bindParam() med flere navngivne parametre

  3. viser et billede gemt i en mysql-blob

  4. Skal jeg bruge en inline varchar(max) kolonne eller gemme den i en separat tabel?