sql >> Databasteknik >  >> RDS >> Mysql

MySQL:NULL vs

För MyISAM-tabeller skapar NULL en extra bit för varje NULLABLE-kolumn (nollbiten) för varje rad. Om kolumnen inte är NULLBAR, behövs aldrig den extra biten information. Det är dock utfyllt till 8 bitars byte så att du alltid får 1 + mod 8 byte för antalet NULLABLE kolumner. 1

Textkolumner skiljer sig lite från andra datatyper. För det första, för "" innehåller tabellposten strängens två bytelängder följt av strängens byte och är en variant av längdstruktur. I fallet med NULL finns det inget behov av längdinformationen men den ingår ändå som en del av kolumnstrukturen.

I InnoDB tar NULLS inget utrymme:De finns helt enkelt inte i datamängden. Detsamma gäller för den tomma strängen eftersom dataoffseten inte heller existerar. Den enda skillnaden är att NULLs kommer att ha NULL-biten inställd medan de tomma strängarna inte gör det. 2

När data faktiskt läggs ut på disken tar NULL och '' upp EXAKT SAMMA UTRYMME i båda datatyperna. Men när värdet söks är det något snabbare att leta efter NULL än att kontrollera efter '' eftersom du inte behöver ta hänsyn till datalängden i dina beräkningar:du kontrollerar bara nollbiten.

Som ett resultat av mellanslagsskillnaderna NULL och '', NULL och '' har INGEN STORLEKSEFFEKT såvida inte kolumnen är specificerad att vara NULLbar eller inte. Om kolumnen INTE är NULL, kommer du bara att se någon prestandaskillnad i MyISAM-tabeller (och då kan NULL självklart inte användas så det är en omtvistad fråga).

Den verkliga frågan kokar sedan ner till tillämpningstolkningen av kolumner "inget värde satt här". Om "" är ett giltigt värde som betyder "användaren skrev ingenting här" eller något liknande, är standard NULL att föredra eftersom du vill skilja mellan NULL och "" när en post skrivs in som inte innehåller några data.

Men generellt sett är standard egentligen bara användbar för att omstrukturera en databas, när nya värden behöver träda i kraft på gamla data. I så fall beror valet återigen på hur applikationsdata tolkas. För vissa gamla data är NULL perfekt och passar bäst (kolumnen fanns inte tidigare så den har NULL-värde nu!). För andra är "" mer lämpligt (ofta när frågorna använder SELECT * och NULL orsakar kraschproblem).

I ULTRA-ALLMÄNNA TERMER (och ur en filosofisk synvinkel) är standard NULL för NULLABLE-kolumner att föredra eftersom det ger den bästa semantiska tolkningen av "Inget värde specificerat".

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

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



  1. Implementera en Multi-Datacenter Setup för PostgreSQL - Del två

  2. Vad är DATALENGTH() i SQL Server?

  3. 2 sätt att konvertera mellan decimal och hexadecimal i MySQL

  4. Infoga en array med Sequel gem i PostgreSQL