Aller au contenu Aller au menu
Vous êtes ici : Développement > MySQL > 1) Bien concevoir la base de données > b) Choix et typage des champs
Langue : fr

b) Choix et typage des champs

Le typage adéquat des champs de la base de données est la deuxième étape incontournable de la conception optimisée d'une base de données. Contrairement à ce qui semble être une croyance répandue parmi de nombreux développeurs, MySQL est livré avec de nombreux autres types de champs que le VARCHAR.

Pour l'exemple, stocker des dates dans des champs VARCHAR est une hérésie vorace en termes de performances :

  • le stockage est bancal, car une date stockée dans un type DATE aurait pris moins d'espace en mémoire
  • le parcours de la table est rendu plus long car la table est plus lourde qu'elle ne devrait l'être
  • le mécanisme d'insertion est également alourdi car un seul champ de type VARCHAR rend la table dynamique, c'est-à-dire que le contenu d'un champ VARCHAR occupe en mémoire très exactement sa longueur (au lieu d'avoir une taille fixée d'avance)
  • le requêtage est rendu difficile car obtenir une date au bon format demande des artifices illisibles et lourds pour le moteur de base de données (CONCAT( SUBSTRING( date_creation, 1, 2 ), '/', SUBSTRING( date_creation, 4, 2 ) , '/', SUBSTRING( date_creation, 7, 4 ) ) là où un DATE_FORMAT( date_creation, '%d/%m/%Y' ) aurait suffi
  • l'indexation d'un VARCHAR n'atteindra jamais les performances de celle d'un champ DATE, tout particulièrement avec des requêtes farcies d'opérations comme celle ci-dessus, qui désactive les index.

De la même façon, le type INT n'est pas le seul et unique type de champ existant pour des entiers. Il existe également le MEDIUMINT, le SMALLINT et le TINYINT (et également dans l'autre sens le BIGINT, mais là n'est pas le propos). Leur taille est plus faible, ce qui permet de gagner à la fois de l'espace de stockage, et du temps de parcours. Le gain peut, certes, paraître négligeable, mais c'est sur le nombre de champs et le volume de données que l'amélioration de performances est remarquable. De façon générale, c'est une bonne pratique de toujours préférer le contenant le plus ajusté à la taille de vos données pour chacun de vos champs.

Notez que la capacité de stockage positif d'un INT peut être doublée en le déclarant UNSIGNED si vous ne comptez pas y stocker de nombre négatif. Les clés primaires et la plupart des champs TINYINT, MEDIUMINT, SMALLINT, INT, BIGINT peuvent généralement être déclarés en UNSIGNED, et devraient l'être si leurs développeurs n'étaient pas aussi fainéants.

Pour avoir la liste des types de champs disponibles dans MySQL et leur utilisation, je ne saurais trop vous conseiller la lecture très enrichissante de la page traitant de ce sujet sur le manuel en ligne de MySQL.

  1. MySQL
    1. 1) Bien concevoir la base de données
      1. a) Choix des tables – Normalisation des données
      2. b) Choix et typage des champs
    2. 2) Indexer les données
      1. a) L'index : un marque-page dans la base de données
      2. b) Une forte cardinalité pour un bon index
      3. c) Une utilisation récurrente pour un bon index
      4. d) Gare aux contre-optimisations
    3. 3) Optimiser les requêtes SQL
      1. a) Utiliser la richesse du langage SQL
      2. b) Optimiser les jointures
      3. c) Mettre à profit une bonne indexation
    4. 4) Corriger les requêtes lentes
      1. a) L'optimisation de requête par EXPLAIN
      2. b) L'analyse post-mortem
    5. 5) Le serveur MySQL – maintenance et backup
      1. a) Minimiser l'impact des opérations de maintenance
      2. b) Sauvegarde et restauration des bases de données
      3. c) Maintenance des tables