Cela dépend du moteur de stockage que vous utilisez.
Au format MyISAM, chaque en-tête de ligne contient un champ de bits avec un bit pour chaque colonne pour coder l'état NULL. Une colonne qui est NULL occupe toujours de l'espace, donc les NULL ne réduisent pas le stockage. Voir https://dev.mysql.com/doc/internals/ fr/myisam-introduction.html
Dans InnoDB, chaque colonne a un "décalage de début de champ" dans l'en-tête de ligne, qui est d'un ou deux octets par colonne. Le bit haut dans ce décalage de début de champ est activé si la colonne est NULL. Dans ce cas, la colonne n'a pas du tout besoin d'être stockée. Donc, si vous avez beaucoup de NULL, votre espace de stockage devrait être considérablement réduit. Voir https://dev.mysql.com/doc/internals/en/innodb-field-contents.html
MODIF :
Les bits NULL font partie des en-têtes de ligne, vous ne choisissez pas de les ajouter.
La seule façon dont je peux imaginer que les NULL améliorent les performances est que dans InnoDB, une page de données peut contenir plus de lignes si les lignes contiennent des NULL. Ainsi, vos tampons InnoDB peuvent être plus efficaces.
Mais je serais très surpris si cela offrait un avantage significatif en termes de performances dans la pratique. S'inquiéter de l'effet des valeurs NULL sur les performances relève de la micro-optimisation. Vous devriez concentrer votre attention ailleurs, dans des domaines qui en donnent le plus pour votre argent. Par exemple, ajouter des index bien choisis ou augmenter l'allocation du cache de la base de données.