Puslapis 11

Didžiausias stulpelių kiekis lentelėje

StandartinėParašytas: 2010-08-11 10:57:59
MKas
Griežtas apribojimas yra 4096 stulpeliai lentelėje, bet dažniausiai maksimalus kiekis gali būti mažesnis. Tikslus apribojimas priklauso nuo keletos faktorių, kuriuos aptarsime toliau.

Kiekviena lentelės maksimalus eilutės dydis yra 65,535 baitai. Šis apribojimas taikomas visiems saugojimo varikliukams, tačiau kai kurie varikliukai turi papildomų apribojimų, dėl to gali būti dar mažesnis maksimalus eilutės dydis.

Maksimalus eilutės dydis riboja stulpelių kiekį, nes bendras stulpelių plotis negali viršyti šio dydžio. Pavyzdžiui, utf8 simboliai reikalauja iki 3 baitų per simbolį, todėl CHAR(255) CHARACTER SET utf8 stulpeliui serveris turi priskirti 255 x 3 = 765 baitus. To pasekoje lentelė negali turėti daugiau nei 65,535 / 765 = 85 tokių stulpelių.

Kintamų dydžių stulpeliuose prisideda stulpelio ilgio baitas, kuris pasiekiamas prieš eilutės dydį. Pavyzdžiui VARCHAR(255) CHARACTER SET utf8 stulpelis užima 2 baitus, kad nurodytu reikšmės dydį, todėl kiekviena reikšmė gali užimti net iki 767 baitų..

BLOB ir TEXT stulpeliai skaičiuojami nuo 1 iki 4 plius 8 baitai į eilutės dydžio apribojimą, nes jų turinys saugomas atskirai.

Stulpelio nustatymas NULL gali sumažinti maksimalų leidžiamą stulpelių skaičių. NULL stulpeliai reikalauja papildomos vietos eilutėje, kad galėtų įrašyti reikšmę, kuri yra NULL.

MyISAM lentelės, kiekvienas NULL stulpelis naudoja papildomai vieną bitą suapvalinant iki artimiausio baito. Maksimalus eilutės ilgis baitais gali būti suskaičiuotas taip:
eilutės ilgis = 1
+ (stulpelių ilgių suma)
+ (NULL stulpelių skaičius + išrynimo_žymė + 7)/8
+ (kintančių reikšmių stulpelių skaičius)


ištrynimo_žymė lygi 1 lentelėse su statiniu eilutės formatu. Statinės lentelės naudoja bitą eilutės įraše, kad nustatytų ar eilutė buvo ištrinta. itrynimo_žymė lygi 0 dinaminėse lentelėse, nes žymė yra saugoma dinaminės eilutės antraštėje.

Šie skaičiavimai netinka InnoDB lentelėms, nes saugojimo dydis neturi skirtumo tarp NULL stulpelių ir NOT NULL stulpelių.

Ši lentelės t1 sukūrimo užklausa bus sėkminga, nes stulpeliai reikalauja 32,765 + 2 baitų ir 32,766 + 2 baitų ir tai telpa į maksimalų 65,535 baitų eilutės dydį:

mysql> CREATE TABLE t1
-> (c1 VARCHAR(32765) NOT NULL, c2 VARCHAR(32766) NOT NULL);
Query OK, 0 rows affected (0.01 sec)


Ši lentelės t2 sukūrimo užklausa nepavyks, nes stulpeliai esantys NULL reikalauja papildomos vietos, kas viršys leistiną 65,535 baitų eilutės dydį:

mysql> CREATE TABLE t2
-> (c1 VARCHAR(32765) NULL, c2 VARCHAR(32766) NULL);
ERROR 1118 (42000): Row size too large. The maximum row size for the
used table type, not counting BLOBs, is 65535. You have to change some
columns to TEXT or BLOBs


Kiekviena lentelė turi .frm bylą, kurioje yra lentelės nustatymai. Serveris naudoja šią išraišką, kad patikrintų kai kurią lentelės saugomą informaciją byloje prieš 64KB apribojimą:

if (info_length+(ulong) create_fields.elements*FCOMP+288+
n_length+int_length+com_length > 65535L || int_count > 255)


Patikrintas informacijos kiekis saugomas .frm byloje negali būti dydesnis nei 64KB, taigi jei lentelės nustatymai pasiekia šį dydį, tai daugiau stulpelių sukurti nebegalima.

Išraiškos faktoriai yra:
    info_length yra erdvė reikalinga “screens.” Tai priklauso nuo MySQL's Unireg.
    create_fields.elements yra stulpelių skaičius.
    FCOMP yra 17.
    n_length yra bendras stulpelių vardų ilgis pridedant vieną baitą vardui kaip skiriamąjį ženklą.
    int_length priklauso nuo sąrašo reikšmių ENUM ir SET stulpeliams.
    com_length yra bendras stulepelių ir lentelės komentarų ilgis.

Taigi, ilgi stulpelių pavadinimai, taip pat ENUM arba SET stulpeliai arba stulpelių ir lentelės komentarų naudojimas gali sumažinti maksimalų stulpelių skaičių.

Laikymo varykliukai gali turėti papildomų apribojimų lentelės stulpelių kiekiui. Pavyzdžiai:
    InnoDB neleidžia daugiau nei 1000 stulpelių.
    InnoDB eilutės apribojimai yra mažesni nei puse duomenų bazės puslapio (apie 8000 baitų), neskaičiuojant VARBINARY, VARCHAR, BLOB ar TEXT stulpelių.
    Skirtingi InnoDB saugojimo formatai (COMPRESSED, REDUNDANT) naudoja skirtingus kiekius puslapio antraštėje ir prikabintuose duomenyse, kurie turi įtakos saugojimo kiekiui eilutėse.

Išversta iš: http://dev.mysql.com/doc/refman/5.0/en/column-count-limit.html