web-dev-qa-db-fra.com

NULL ou NOT NULL par défaut?

Dans MySQL, est-il préférable de toujours autoriser les valeurs nulles sauf si vous savez qu'un champ est requis, ou utilisez toujours Not Null sauf si vous savez qu'un champ contiendra des valeurs nulles? Ou n'est-ce pas important?

Je sais que dans certains SGBD, ils disent d'utiliser Not Null autant que possible car autoriser les valeurs nulles nécessite un bit supplémentaire (ou octet?) par enregistrement pour stocker l'état Null.

41
BenV

Dans la plupart des bases de données, un NOT NULL la colonne sera plus efficace en termes de données stockées pour la raison que vous énoncez, et aussi plus efficace pour interroger et indexer - donc à moins que vous ne vouliez autoriser les NULL dans une colonne, vous devez explicitement les interdire.

Il y aura une légère implication dans les performances, car le supplément NOT NULL les contraintes devront potentiellement être vérifiées pour chaque ligne affectée avec n'importe quel INSERT ou UPDATE, mais comme la plupart des bases de données sont relativement en écriture et en lecture, ce n'est probablement pas un problème (le peu de temps supplémentaire pris ne sera probablement pas perceptible à tout de même car c'est une opération liée au CPU où le reste de l'opération d'insertion/mise à jour sera lié aux IO et donc un goulot d'étranglement beaucoup plus important) et il vous donne une vérification des données "gratuite" afin que votre code (ou autre code des personnes) ne peut pas mettre accidentellement des valeurs NULL là où aucun autre code ne les attend et peut donc donner des résultats incorrects en leur présence.

Edit: Comme Peter le fait remarquer dans son commentaire, ce qui précède est un généralisme et peut ne pas être vrai pour tous DMBS, bien que je sois presque sûr que c'est le cas pour mysql et mssql. D'autres complications dans le domaine pourraient inclure des fonctionnalités telles que des tables clairsemées (telles que MSSQL 2008 implémentées par exemple) qui modifieront la dynamique des performances des colonnes (non) nullables.

25
David Spillett

Vous devez laisser la conception de votre schéma et les exigences de l'application guider cette décision. Les différences de performances ne sont probablement pas perceptibles dans les deux cas dans la plupart des cas.

9
Peter Eisentraut