Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

NULL no MySQL (desempenho e armazenamento)


Depende de qual mecanismo de armazenamento você usa.

No formato MyISAM, cada cabeçalho de linha contém um campo de bits com um bit para cada coluna para codificar o estado NULL. Uma coluna que é NULL ainda ocupa espaço, portanto, NULLs não reduzem o armazenamento. Veja https://dev.mysql.com/doc/internals/ pt/myisam-introduction.html

No InnoDB, cada coluna tem um "deslocamento inicial do campo" no cabeçalho da linha, que é um ou dois bytes por coluna. O bit alto nesse deslocamento inicial de campo está ativado se a coluna for NULL. Nesse caso, a coluna não precisa ser armazenada. Portanto, se você tiver muitos NULLs, seu armazenamento deve ser significativamente reduzido.Consulte https://dev.mysql.com/doc/internals/en/innodb-field-contents.html

EDITAR:

Os bits NULL fazem parte dos cabeçalhos de linha, você não escolhe adicioná-los.

A única maneira de imaginar NULLs melhorando o desempenho é que no InnoDB, uma página de dados pode caber em mais linhas se as linhas contiverem NULLs. Portanto, seus buffers InnoDB podem ser mais eficazes.

Mas eu ficaria muito surpreso se isso proporcionar uma vantagem significativa de desempenho na prática. Preocupar-se com o efeito que os NULLs têm no desempenho está no domínio da micro-otimização. Você deve focar sua atenção em outro lugar, em áreas que dão maior retorno pelo investimento. Por exemplo, adicionar índices bem escolhidos ou aumentar a alocação de cache do banco de dados.