49 votes

Quand utiliser NULL dans les tables MySQL

J'apprécie le contenu sémantique d'une valeur NULL dans une table de base de données, différent à la fois faux et la chaîne vide ". Cependant, j'ai souvent lu sur les problèmes de performance lorsque les champs sont les valeurs null et été conseillé d'utiliser une chaîne vide dans le cas où la valeur NULL est en fait sémantiquement correct.

Quelles sont les circonstances sont appropriées pour l'utilisation nullable champs et les valeurs NULL? Quels sont les compromis? Est-il judicieux de simplement éviter d'utiliser les valeurs Null complètement et simplement utiliser les cordes à vide, false ou 0 pour indiquer l'absence de valeur?

Mise à JOUR

OK - je comprends la différence sémantique entre " et NULL ainsi que la (performance-agnostique) les circonstances dans lesquelles la valeur NULL est le champ approprié de la valeur. Cependant, permettez-moi de m'étendre sur l'allusion problème de performance. C'est de l'excellent "Haute Performance MySQL" par Schwartz, Zeitsev et al http://www.borders.co.uk/book/high-performance-mysql-optimization-backups-replication-and-more/857673/:

Il est plus difficile pour MySQL afin d'optimiser les requêtes qui renvoient à nullable coumns, parce qu'ils font des index, index les statistiques et comparaisons de la valeur plus compliqué. Une colonne nullable utilise plus d'espace de stockage et nécessite traitement spécial à l'intérieur de MySQL. Lorsque nullable colonne est indexée, il nécessite un octet supplémentaire pour l'entrée et peut même causer une taille fixe en effet (comme un index sur un unique entier colonne) pour être converti en de taille variable dans un MyISAM.

Plus ici: Google livres aperçu

C'est peut-être la réponse définitive - je viens de regarder pour un deuxième avis et de l'expérience à partir de la ligne de front.

37voto

Bill Karwin Points 204877

Cependant, j'ai souvent lu sur des problèmes de performances lorsque les champs sont les valeurs null et été conseillé d'utiliser un chaîne vide dans le cas où la valeur NULL est en fait sémantiquement correct.

Je vais être tatillon sur le choix des mots pour un moment:

  • Même si elle était un important facteur de performance, ce n'en est pas sémantiquement correct d'utiliser une valeur à la place de NULL. Dans SQL, NULL a un rôle sémantique pour désigner un manque ou inapplicable valeur. Les caractéristiques de performance de la valeur NULL dans un SGBDR mise en œuvre sont indépendants de cette. La performance peut varier d'une marque à l'autre ou à partir d'une version à l'autre, mais le but de NULL dans la langue est compatible.

En tout cas, je n'ai pas entendu parler de tout élément de preuve qu'NULL fonctionne mal. Je serais intéressé par toutes les références à des mesures de performance qui montrent nullable colonnes effectuer de pire que les non-nullable colonnes.

Je ne dis pas que je ne me trompe pas ou qu'il ne peut pas être vrai dans certains cas, mais seulement qu'il n'est pas significatif pour le rendre inactif suppositions. La Science n'est pas faite de conjecture; on a la preuve avec la répétabilité des mesures.

Les métriques de vous dire aussi par la façon dont beaucoup de la performance diffère, de sorte que vous pouvez porter un jugement quant à savoir si c'est quelque chose à la peine de s'inquiéter au sujet de. Qui est, l'impact pourrait être mesurables et différente de zéro, mais toujours insignifiant par rapport à une plus grande performance de facteurs, tels que correctement l'indexation des tables ou le dimensionnement de la base de données du cache.

Dans MySQL, les recherches pour la valeur NULL peut bénéficier d'un index:

mysql> CREATE TABLE foo (
  i INT NOT NULL,
  j INT DEFAULT NULL,
  PRIMARY KEY (i),
  UNIQUE KEY j_index (j)
);

mysql> INSERT INTO foo (i, j) VALUES 
  (1, 1), (2, 2), (3, NULL), (4, NULL), (5, 5);

mysql> EXPLAIN SELECT * FROM foo WHERE i = 3;
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
|  1 | SIMPLE      | foo   | const | PRIMARY       | PRIMARY | 4       | const |    1 |       | 
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+

mysql> EXPLAIN SELECT * FROM foo WHERE j IS NULL;
+----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key     | key_len | ref   | rows | Extra       |
+----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
|  1 | SIMPLE      | foo   | ref  | j_index       | j_index | 5       | const |    2 | Using where | 
+----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+

Remarque c'est toujours pas une mesure de rendement. Je n'ai montré que vous pouvez utiliser un index lors de la recherche de la valeur NULL. Je vais faire valoir (il est vrai sans avoir mesuré, mais bon c'est juste StackOverflow) que l'avantage d'un indice éclipse toute éventuelle sanction lors de la recherche pour les NULS par rapport à une chaîne vide.

Ce n'est pas une conception correcte de la décision de choisir le zéro ou vide ou toute autre valeur à substituer à la valeur NULL. Vous devrez peut-être utiliser ces valeurs dans la colonne. C'est pourquoi NULL existe, comme une valeur qui est par définition en dehors du domaine de valeurs de tout type de données, de sorte que vous pouvez utiliser la gamme complète des valeurs des entiers ou des chaînes ou quoi que ce soit et avoir encore quelque chose pour signifier "aucun des valeurs ci-dessus."

11voto

Ólafur Waage Points 40104

Le manuel de MySQL a fait un bel article sur les problèmes avec NULL.

Elle pourra être qu'utile.

Également trouvé cette autre donc poster sur les performances et valeur NULL

5voto

Kieran Senior Points 6053

Nous n'avons pas autoriser les valeurs NULL dans nos bases de données, sauf pour les valeurs numériques, ou pour les dates. La raison pour laquelle nous faisons ce est parce que des valeurs numériques, parfois, ne doit pas être en défaut à zéro, ce qui est très, très mauvais. Je suis un développeur pour un courtiers en bourse et il y a une grosse, grosse différence entre la valeur NULL et 0. L'utilisation de FUSIONNER est très pratique si nous voulons des valeurs par défaut à zéro, même si nous n'avons pas les stocker en tant que tels.

MyVal = COALESCE(TheData, 0)

Comme nous l'avons effectuer des insertions de données à partir de fichiers plats, nous utilisons des fichiers de format pour déterminer l'entrée des données automatiquement convertit des valeurs vides dans les chaînes vides de toute façon.

Les Dates par défaut à la valeur que peut apparaître la personne à charge sur le classement je crois, mais la nôtre par défaut à quelque chose comme 1900, et encore une fois, les dates sont très importantes. D'autres en texte clair les valeurs ne sont pas si important, et si laissé vide généralement qualifier en tant que bien.

3voto

Jim Anderson Points 2702

En règle générale, si un attribut est requis, il est défini comme Not NULL, et si elle peut être omise, elle est définie comme nullable.

1voto

SquareCog Points 12947

Le principal avantage, bien sûr, est la signification sémantique, NULL, vous l'avez mentionné.

En plus de cela -- et peut dépendre de votre moteur de stockage, comme toujours, consultez la documentation -- mais, au moins dans certaines bases de données, les valeurs Null, ils prennent beaucoup moins de place qu'une simple valeur. Par exemple, si vous avez un "varchar" colonne déclaré à 20 caractères, et il est rarement remplie, vous pourrez économiser beaucoup d'espace disque en le faisant NULL au lieu d'une chaîne vide.

Je n'ai jamais entendu parler de problèmes de performances avec l'aide de Zéros, on fait le contraire. J'ai entendu parler de gens qui nettoie leur compte car ils ont compté les valeurs Null mal, mais jamais de la performance. Si c'est vrai, j'aimerais en entendre parler!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X