Optimiser

Eléphant du PHP | 351 Messages

01 déc. 2005, 15:57

Bonjour,
J'aimerais pouvoir enregistrer beaucoup de champs sur chaque table et donc beaucoup d'informations
Je voudrais trouver un moyen pour réduire au maximum la taille de la base de données MYSQL

Ma premiere solution consiste à utiliser 1 champ pour deux c'est à dire enregistrer deux informations dans un champ d'une table. Et donc je sépare chaque information par une virgule ensuite je récupere avec PHP

Je voudrais savoir si ma solution est efficace pour réduire le poids et y'aurai t-il d'autres solutions ?

ViPHP
pjl
ViPHP | 2119 Messages

01 déc. 2005, 16:47

je ne suis pas convaincu que cette solution te fasse gagner de l'espace par contre celà va être contraignant pour l'exploitation de la base et demander plus de ressources.

En fait, le problème d'optimisation d'une BDD n'est pas une question de place mais une question d'optimisation des champs (format et taille), d'indexation de d'analyse préalable, ce qui donnera un bon MCD.

Eléphant du PHP | 351 Messages

02 déc. 2005, 15:19

En fait, le problème d'optimisation d'une BDD n'est pas une question de place mais une question d'optimisation des champs (format et taille), d'indexation de d'analyse préalable, ce qui donnera un bon MCD.
Aurais tu plus d'informations sur l'optimisation des champs ? comment faire ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

02 déc. 2005, 15:34

je rejoint pjl

ta méthode va te permettre de gagner quelques octets dans les déclarations des tables mais le volume de données sera identique

Par contre, pour faire une requete SQL, ça va être vachement plus complexe

Toujours pour appuyer pjl, il vaut mieux une base de données bien pensée qu'une base de données qui prend peu de place
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

02 déc. 2005, 15:47

1. Nombre de champs
Le nombre de champs d'une table n'est pas un obstacle à l'optimisation d'une base.
Tu peux avoir un nombre important de champs dans une table,
ce qui importe, c'est que le type de chacun soit défini au plus juste des données qu'il contient.

Il est par exemple stupide de définir un champ prenom en varchar(255).
Un varchar(30) suffit plus qu'amplement. (et merde à Jean-Eugène-Édouard-Hypolyte-Charles-Arthur-Ghislain-Thibault de etc. !) :langue:


2. Tables de référence
Ensuite, il est préférable d'éviter de remplir ses tables
avec des "données de traitement" (par opposition à des "données d'information").
Je m'explique :
Supposons que tu enregistres dans une table les réponses obtenues lors d'un sondage.
Tu ne vas pas enregistrer dans le champ "reponse" de ta table les valeurs :
"Tout à fait d'accord", "plutôt d'accord", "indifférent", "plutôt pas d'accord", "pas d'accord du tout", etc.
Non, tu vas enregistrer les valeurs 1, 2, 3, 4, 5, etc.
en prévoyant une correspondance pour chacune de ces valeurs.

Un champ int est plus économe en place mémoire, en ressources serveur et plus facile à traiter.

En outre, cela contribue à te protèger contre la redondance des données...


3. Redondance des données
(quelle magnifique transition, y a des jours où je m'épate...) :lol:
La redondance des données, donc, est une erreur liée à une modélisation imparfaite.
Là encore, un exemple :
Tu gères un carnets d'adresse.
Pour chaque contact, tu as prévu un champ "ville".

Supposons que tu as plein d'amis stéphanois
(tu as raison, ce sont des gens très bien), :mrgreen:
ta colonne ville contiendra plein de "Saint-Étienne",
ce qui est assez lourd (13 octets minimum)
sans compter le risque d'erreurs !!! :evil:

En effet, tu risques fort d'avoir dans ce champ des valeurs telles que :
Saint-Étienne, Saint Étienne, Saint-Etienne, Saint Etienne, St-Étienne, St Étienne, St-Etienne, St Etienne, etc.

Les variantes ne manquent pas. Elles désignent certes la même ville
mais crois-tu que ton moteur de recherche (ta requête SQL) saura le reconnaître ?

Alors que si tu te bornes à saisir les valeurs 42000 et 42100
et en créant une table de correspondance où ces valeurs sont associées à "Saint-Étienne",
tu supprimeras les erreurs liées aux fautes d'orthographe et allègera ta base. :pouce:
(Il me semble en effet qu'on commet moins de fautes d'orthographe sur une valeur numérique. ;)

Eléphant du PHP | 351 Messages

02 déc. 2005, 16:16

Il est par exemple stupide de définir un champ prenom en varchar(255).
Un varchar(30) suffit plus qu'amplement. (et merde à Jean-Eugène-Édouard-Hypolyte-Charles-Arthur-Ghislain-Thibault de etc. !) :langue:
Est ce qu'en mettant varchar(30) il y'a un avantage ?

ET si jamais il y'a un Jean-Eugène-Édouard-Hypolyte-Charles-Arthur-Ghislain-Thibault que se passerait il ?

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

02 déc. 2005, 16:59

Est ce qu'en mettant varchar(30) il y'a un avantage ?
pour chaque enregistrement, tu consommes maximum 30 octets au lieu de 255, soit 88% d'économie... ;)
Et si jamais il y'a un Jean-Eugène-Édouard-Hypolyte-Charles-Arthur-Ghislain-Thibault que se passerait il ?
Tu lui coupes la tête, citoyen ! :axe:
À défaut d'octets, ça économisera des centimètres... :langue:

Maintenant, si tu en te sens pas l'âme d'un sans-culotte,
tu l'inscriras sous le nom de "Jean-Eugène", tout simplement. :lol:

Comment font les imprimeurs de cartes de visites ?
As-tu déjà vu une carte de visite de 25 cm de large ?... ;)

Eléphant du PHP | 351 Messages

02 déc. 2005, 17:47

OK merci


Mais par exemple un champ prenom varchar(255) ayant un enregistrement 'Pierre'

Et un autre champ prenom varchar(30) ayant un enregistremenet 'Pierre' aussi, est ce que cela prend moi de place ?

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

02 déc. 2005, 17:54

Un tout p'tit peu de recherche t'apportera toutes les réponses dont tu as besoin... ;)

http://dev.mysql.com/doc/refman/5.0/fr/char.html

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

02 déc. 2005, 17:56

J'en profite pour apporter une correction :
pour chaque enregistrement, tu consommes maximum 30 octets au lieu de 255, soit 88% d'économie... ;)
Sachant qu'un varchar(n) contenant une valeur de m caractères (avec m<=n) utilise m+1 octets,
un varchar(30) utilise entre 1 et 31 octets (bornes incluses), selon la valeur de m.

ViPHP
pjl
ViPHP | 2119 Messages

02 déc. 2005, 23:44

avant d'ergoter sur la taille des champs, le MCD est fait ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

07 déc. 2005, 12:51

Modération : la seconde question méritant un nouveau sujet, j'ai scindé le post
nouveau post : http://www.phpfrance.com/forums/voir_reponse-83721.php
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer