Question

Qu'est-ce que null fait exactement en termes de performances et de stockage (espace) dans MySQL?

Par exemple:

TINYINT: 1 Byte TINYINT w / NULL 1 octet + stocke en quelque sorte NULL?

Était-ce utile?

La solution

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 afin de coder l'état NULL. Une colonne ayant la valeur NULL occupe toujours de la place. Par conséquent, la valeur NULL ne réduit pas le stockage. Voir https://dev.mysql.com/doc/internals/en/ myisam-introduction.html

Dans InnoDB, chaque colonne comporte un "décalage de début de champ". dans l'en-tête de ligne, ce qui correspond à un ou deux octets par colonne. Le bit haut dans le décalage de début de ce champ est activé si la colonne est NULL. Dans ce cas, la colonne n'a pas besoin d'être stockée. Donc, si vous avez beaucoup de NULL, votre stockage devrait être considérablement réduit. Voir https://dev.mysql.com/doc/internals/ fr / innodb-field-contents.html

EDIT:

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 valeurs NULL améliorent les performances est que, dans InnoDB, une page de données peut contenir davantage de lignes si celles-ci contiennent des valeurs NULL. Ainsi, vos tampons InnoDB pourraient être plus efficaces.

Mais je serais très surpris que cela procure un avantage de performance significatif 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 rapportent le plus. Par exemple, ajouter des index bien choisis ou augmenter l’allocation du cache de la base de données.

Autres conseils

La réponse de Bill est bonne, mais un peu dépassée. L'utilisation d'un ou deux octets pour stocker la valeur NULL s'applique uniquement au format de ligne InnoDB REDUNDANT. Depuis MySQL 5.0.3, InnoDB utilise le format de ligne COMPACT qui utilise un seul bit pour stocker une valeur NULL (bien sûr, un octet est le minimum). Par conséquent:

Espace requis pour les valeurs NULL = octets CEILING (N / 8) où N est le nombre de colonnes NULL d'une ligne.

  • 0 NULLS = 0 octet
  • 1 - 8 NULLS = 1 octet
  • 9 - 16 NULLS = 2 octets
  • 17 - 24 NULLS = 3 octets
  • etc ...

Selon le site officiel MySQL sur COMPACT vs REDUNDANT:

  

Le format de ligne compacte réduit l’espace de stockage de ligne d’environ 20% au prix d’une utilisation accrue de la CPU pour certaines opérations. Si votre charge de travail est typique et est limitée par les taux d'accès au cache et la vitesse du disque, le format compact sera probablement plus rapide.

Avantage d'utiliser NULLS sur des chaînes vides ou des zéros:

  • 1 NULL nécessite 1 octet
  • 1 chaîne vide nécessite 1 octet (en supposant que VARCHAR)
  • 1 Zéro nécessite 4 octets (en supposant que INT)

Vous commencez à voir les économies ici:

  • 8 NULL nécessitent 1 octet
  • 8 chaînes vides nécessitent 8 octets
  • 8 zéros nécessitent 32 octets

D'autre part, je suggère d'utiliser des valeurs NULL sur des chaînes ou des zéros vides, car elles sont plus organisées, portables et nécessitent moins d'espace. Pour améliorer les performances et économiser de l'espace, utilisez plutôt les types de données, les index et les requêtes appropriés, plutôt que des astuces étranges.

Plus sur: https://dev.mysql.com/doc/refman /5.7/en/innodb-physical-record.html

Je suis d'accord avec Bill Karwin, bien que j'ajouterais ces astuces sur MySQL . Le numéro 11 répond précisément à cette question:

  

Tout d’abord, demandez-vous s’il existe une différence entre une valeur de chaîne vide et une valeur NULL (pour les champs INT: 0 par rapport à NULL). S'il n'y a aucune raison d'avoir les deux, vous n'avez pas besoin d'un champ NULL. (Saviez-vous qu'Oracle considère que NULL et une chaîne vide sont identiques?)

     

Les colonnes NULL nécessitent de l'espace supplémentaire et peuvent ajouter de la complexité à vos instructions de comparaison. Il suffit de les éviter quand vous le pouvez. Cependant, je comprends que certaines personnes peuvent avoir des raisons très spécifiques d’avoir des valeurs NULL, ce qui n’est pas toujours une mauvaise chose.

D'un autre côté, j'utilise toujours la valeur null sur les tables ne contenant pas beaucoup de lignes, principalement parce que j'aime la logique de dire NOT NULL.

Mettre à jour En repensant à cela plus tard, j'ajouterais que je n'aime personnellement pas utiliser 0 au lieu de NULL dans la base de données, et je ne le recommande pas. Cela peut facilement entraîner beaucoup de faux positifs dans votre application si vous ne faites pas attention.

dev.mysql.com/doc/refman/ 5.0 / fr / is-null-optimization.html

MySQL peut effectuer la même optimisation sur nom_colonne IS NULL que sur nom_col = valeur_ constant. Par exemple, MySQL peut utiliser des index et des plages pour rechercher NULL avec IS NULL

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top