Eu tenho um monte de colunas na minha tabela de banco de dados MySQL que armazenam booleanos (0 ou 1) como tinyints. Eles são 0 por padrão e não devem ser nulos. Estou pensando em definir a propriedade da coluna como NOT NULL para que haja outra verificação de validação apenas no caso. Eu me pergunto se isso terá o custo de aumentar o tamanho da mesa no futuro. Meu medo é que, talvez, a propriedade NOT NULL adicione outro bit a cada entrada de dados?
Meu banco de dados é novo e praticamente vazio então quando tento verificar o tamanho da tabela sempre me dá 16kb.
Da documentação do MySQL (ênfase minha):
Então, pelo contrário,
NOT NULL
economiza espaço em disco, em vez de custar mais.Qual Motor você está usando?
No máximo,
NULLs
use 1 byte por 8 colunas anuláveis. Na outra direção, umNULL
valor pode ocupar menos espaço. De que tipo de dados você está falando?Veja também
SET
. Este tipo de dados permite colocar até 64 sinalizadores booleanos em até 8 bytes de espaço.Há muito tempo, decidi que as considerações de espaço
NULL
de versusNOT NULL
eram tão insignificantes que não valia a pena pensar sobre isso. Eu tenho uma regra prática: se uma otimização provisória (NULL, etc)
não vai economizar 10% de algo (espaço, velocidade, etc), então largue o tópico e procure outra coisa para otimizar.Em vez disso, concentro-me em usar,
NOT NULL
exceto quando tenho um motivo comercial ou uma lógica de processamento que pode fazer bom uso deNULL
:Eu insisto em pensar cuidadosamente sobre os tipos de dados ao criar inicialmente uma tabela. É doloroso fazer alterações de esquema mais tarde. Exemplos:
SMALLINT
em vez de um de 4 bytesINT
. (Menor economiza espaço em disco e ajuda a acelerar)UNSIGNED
.CHARACTER SET
eCOLLATION
correto.NULL
vs.NOT NULL
_ (Por razões lógicas, não velocidade ou espaço)