web-dev-qa-db-fra.com

Mysql indexe-t-il les valeurs nulles?

J'ai une table mysql où une colonne INT indexée va être 0 pour 90% des lignes. Si je modifie ces lignes pour utiliser NULL au lieu de 0, seront-elles exclues de l'index, ce qui rend l'index environ 90% plus petit?

57
too much php

http://dev.mysql.com/doc/refman/5.0/en/is-null-optimization.html

MySQL peut effectuer la même optimisation sur col_name IS NULL qu'il peut utiliser pour col_name = constant_value. Par exemple, MySQL peut utiliser des index et des plages pour rechercher NULL avec IS NULL

24
Chu Khanh Van

Il semble qu'il indexe également les NULLs.

Soyez prudent lorsque vous l'exécutez, car MySQL VERROUILLE la table pour WRITES lors de la création de l'index. La construction de l'index peut prendre un certain temps sur de grandes tables même si la colonne est vide (toutes null).

Référence .

7
Bill the Lizard

Autoriser une colonne à être null ajoutera un octet aux exigences de stockage de la colonne. Cela entraînera une augmentation de la taille de l'indice, ce qui n'est probablement pas bon. Cela dit, si un grand nombre de vos requêtes sont modifiées pour utiliser "IS NULL" ou "NOT NULL", elles pourraient être globalement plus rapides que de faire des comparaisons de valeurs.

Mon instinct me dirait non nul, mais il y a une réponse: test!

2
J.D. Fitz.Gerald

Non, il continuera de les inclure, mais ne faites pas trop d'hypothèses sur les conséquences dans les deux cas. Cela dépend beaucoup de la gamme d'autres valeurs (google pour "cardinalité").

MSSQL a un nouveau type d'index appelé "index filtré" pour ce type de situation (c'est-à-dire qu'il inclut des enregistrements dans l'index basés sur un filtre). Les systèmes de type dBASE avaient auparavant des capacités similaires et c'était assez pratique.

1
dkretz

Chaque index a une cardinalité signifie combien de valeurs distinctes sont indexées. AFAIK ce n'est pas une idée raisonnable de dire que les index répètent la même valeur pour de nombreuses lignes, mais l'index adresse uniquement une valeur répétée à l'index cluster de plusieurs lignes (lignes ayant une valeur nulle pour ce champ) et en conservant l'ID de référence de l'index cluster signifie: chaque ligne avec un champ indexé de valeur NULL gaspille une taille aussi grande que le PK (pour cette raison, les experts recommandent d'avoir une taille de PK raisonnable si vous avez un PK composite).

1
Alix