sql >> Databáze >  >> RDS >> Mysql

MySQL:NULL vs

U tabulek MyISAM NULL vytvoří extra bit pro každý sloupec s hodnotou NULLABLE (nulový bit) pro každý řádek. Pokud sloupec nemá hodnotu NULLABLE, bit informace navíc není nikdy potřeba. To je však doplněno na 8 bitových bajtů, takže vždy získáte 1 + 8 bajtů pro počet sloupců s hodnotou NULLABLE. 1

Textové sloupce se trochu liší od ostatních datových typů. Za prvé, pro "" záznam tabulky obsahuje dvoubajtovou délku řetězce následovanou byty řetězce a je strukturou s variantou délky. V případě NULL není potřeba informace o délce, ale i tak je zahrnuta jako součást sloupcové struktury.

V InnoDB nezabírají NULLS žádné místo:V sadě dat prostě neexistují. Totéž platí pro prázdný řetězec, protože neexistují ani offsety dat. Jediný rozdíl je v tom, že hodnoty NULL budou mít nastaven bit NULL, zatímco prázdné řetězce nikoli. 2

Když jsou data skutečně rozmístěna na disku, zabírají NULL a '' PŘESNĚ STEJNÉ MÍSTO v obou typech dat. Když je však prohledávána hodnota, kontrola NULL je o něco rychlejší než kontrola '', protože ve výpočtech nemusíte brát v úvahu délku dat:kontrolujete pouze nulový bit.

V důsledku rozdílů mezi NULL a '' NULL a '' nemají ŽÁDNÝ DOPAD NA VELIKOST, pokud není ve sloupci uvedeno, že má hodnotu NULL nebo ne. Pokud sloupec NENÍ NULL, pouze v tabulkách MyISAM uvidíte rozdíl ve výkonu (a pak samozřejmě nelze použít výchozí hodnotu NULL, takže je to sporná otázka).

Skutečná otázka se pak scvrkává na aplikační výklad sloupců „zde není nastavena žádná hodnota“. Pokud je "" platná hodnota, která znamená "uživatel sem nic nezadal" nebo něco podobného, ​​pak je vhodnější výchozí NULL, protože chcete rozlišovat mezi NULL a "" při zadání záznamu, který neobsahuje žádná data.

Obecně je však výchozí hodnota skutečně užitečná pouze pro refaktorování databáze, když je třeba, aby nové hodnoty vstoupily v platnost na stará data. V tomto případě opět závisí výběr na tom, jak jsou data aplikace interpretována. Pro některá stará data je NULL naprosto vhodná a nejlépe se hodí (sloupec dříve neexistoval, takže má nyní hodnotu NULL!). Pro ostatní je vhodnější "" (často když dotazy používají SELECT * a NULL způsobuje problémy se selháním).

V ULTRA-GENERAL TERMS (a z filozofického hlediska) je preferována výchozí hodnota NULL pro sloupce s NULL, protože poskytuje nejlepší sémantickou interpretaci "No Value Specified".

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

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



  1. NULL v MySQL (výkon a úložiště)

  2. Co a kdy mám zadat setFetchSize()?

  3. mysql:získat počet záznamů mezi dvěma datum-čas

  4. Je INSERT RETURNING zaručeno, že vrátí věci ve správném pořadí?