sql >> Database >  >> RDS >> Mysql

MySQL:NULL vs

Voor MyISAM-tabellen creëert NULL een extra bit voor elke NULLABLE-kolom (de null-bit) voor elke rij. Als de kolom niet NULLABLE is, is het extra stukje informatie nooit nodig. Dat is echter opgevuld tot 8 bit bytes, zodat u altijd 1 + mod 8 bytes krijgt voor het tellen van NULLABLE-kolommen. 1

Tekstkolommen verschillen een beetje van andere gegevenstypen. Ten eerste bevat de tabelinvoer voor "" de lengte van twee bytes van de tekenreeks gevolgd door de bytes van de tekenreeks en is het een structuur met een variantlengte. In het geval van NULL is de lengte-informatie niet nodig, maar het is hoe dan ook opgenomen als onderdeel van de kolomstructuur.

In InnoDB nemen NULLS geen ruimte in beslag:ze bestaan ​​gewoon niet in de dataset. Hetzelfde geldt voor de lege string, aangezien de data-offsets ook niet bestaan. Het enige verschil is dat de NULL's de NULL-bit hebben en de lege strings niet. 2

Wanneer de gegevens daadwerkelijk op schijf staan, nemen NULL en '' PRECIES DEZELFDE RUIMTE in beide gegevenstypen in beslag. Wanneer echter naar de waarde wordt gezocht, is het controleren op NULL iets sneller dan het controleren op '', omdat u geen rekening hoeft te houden met de gegevenslengte in uw berekeningen:u controleert alleen het null-bit.

Als resultaat van de NULL en '' ruimteverschillen, NULL en '' GEEN SIZE IMPACT hebben, tenzij de kolom is gespecificeerd als NULLable of niet. Als de kolom NIET NULL is, zie je alleen in MyISAM-tabellen enig verschil in prestatie (en dan kan de standaard NULL natuurlijk niet worden gebruikt, dus het is een betwistbare vraag).

De echte vraag komt dan neer op de toepassingsinterpretatie van kolommen "geen waarde ingesteld". Als de "" een geldige waarde is, wat betekent "de gebruiker heeft hier niets ingevoerd" of iets dergelijks, dan heeft standaard NULL de voorkeur omdat u onderscheid wilt maken tussen NULL en "" wanneer een record wordt ingevoerd zonder gegevens.

Over het algemeen is standaard echter alleen nuttig voor het herstructureren van een database, wanneer nieuwe waarden van kracht moeten worden op oude gegevens. In dat geval hangt de keuze opnieuw af van hoe de applicatiegegevens worden geïnterpreteerd. Voor sommige oude gegevens is NULL perfect geschikt en de beste pasvorm (de kolom bestond voorheen niet, dus heeft deze nu een NULL-waarde!). Voor anderen is "" meer geschikt (vaak wanneer de query's SELECT * gebruiken en NULL crashproblemen veroorzaakt).

In ULTRA-ALGEMENE TERMEN (en vanuit een filosofisch standpunt) heeft standaard NULL voor NULLABLE-kolommen de voorkeur omdat dit de beste semantische interpretatie geeft van "Geen waarde gespecificeerd".

1 [http://forge.mysql.com/wiki/MySQL_Internals_MyISAM]

2 [http://forge.mysql.com/wiki/MySQL_Internals_InnoDB]



  1. Waarschuwingslogboeken filteren in EM13c

  2. Retourneer alle externe sleutels die verwijzen naar een bepaalde tabel in SQL Server

  3. Tabel maken in procedure

  4. Hoe een .db-bestand bij een andere .apk-android te voegen