Page 1 sur 1

Question Requête sur un champ destiné à un explode

Posté : 04 mai 2007, 21:14
par dogmongo
Bonjour

Je travail sur une table devant me lister des produits

Un de ces champs va être utilisé sur une fonction explode, ça m'évite d'avoir une table mysql énorme.

Cela ce présente sous cette forme, une des champs regroupe des données séparé par le caractère |

donnée1|donnée2|donnée3|donnée4|donnée5|etc.

Ma question est, puis-je faire une condition dans ma requête WHERE sur donnée2 de ce champs :?:

Merci d'avance

Posté : 04 mai 2007, 21:47
par Hubert Roksor
Oui, bien sûr, il te suffit de faire

Code : Tout sélectionner

SELECT * FROM table WHERE colonne LIKE '%|donnée2|%'
Ça marche très bien à condition de ne jamais avoir de caractère | dans le nom d'un produit. Seul petit désavantage de cette méthode, c'est environ 1000 fois plus lent que la table énorme dont tu parles.

Mon conseil : structure tes données normalement, mets un index sur la colonne en question et ne te soucie pas de la taille de ta table tant que ça reste en dessous de 1 GiB.

PS: déplacé dans le bon forum. Le mot-clé est "normalisation", tu trouveras pas mal de topics à ce sujet.

Posté : 05 mai 2007, 00:17
par dogmongo
Génial, je te remercie ça marche vraiment bien j'ai noté aucun ralentissement bien au contraire.

Mais je vais te poser une question sur mysql puisque tu sembles bien connaitre le sujet, si tu veux bien, comment je pourrais voir si un script occupe moins de ressource mysql et serveur qu'un autre script ?

Et encore merci pour la rapidité de ta réponse

Posté : 05 mai 2007, 00:39
par Hubert Roksor
Euh, tu sais la première phrase mon précédent post était en fait destinée à être sarcastique. Si tu utilises une requête LIKE je te promets que tu vas très amèrement le regretter. À moins d'utiliser un index FULLTEXT (qui n'est pas fait pour ça d'ailleurs) MySQL va lire 100% de ta table à chaque requête. Si tu normalises les données (la grosse table) alors MySQL va probablement lire moins de 1% des données par requête. Si ton échantillon de données est trop petit pour noter le ralentissement alors ta table doit être minuscule. Et si ta table est assez grosse pour te donner envie de dénormaliser alors les pertes en performance vont être phénoménales. Et ne crois pas une seule seconde que j'exagère. Le jour où ta table sera plus grosse que la quantité de RAM disponible, ton serveur va tout simplement planter. D'un jour à l'autre et sans avertissement.

À part ça, comment on fait pour juger de la performance d'un script PHP. C'est un très long sujet, ça s'appelle du "profiling" (go go Google, regarde du côté de XDebug, CacheGrind et WinCacheGrind). Pour les requêtes SQL on utilise la commande EXPLAIN.

Posté : 05 mai 2007, 12:43
par dogmongo
Entendu je vais lire de la documentation la dessus, il semble y avoir beaucoup d'info j'ai de quoi étudier ! C’est très pointu mais si intéressant comme tu la souligné j’ai effectivement des problème serveur.

Sinon je vais vite structurer mes données normalement comme avant tout au moins les données qui risque d'être utiliser pour une condition dans mes requête !

Le reste ça ne cause aucun soucis je pense c'est quand même incroyablement plus pratique avec un explode, l'avantage est que j’ai un critère en plus sur un produit, j’ai pas à modifier le système de gestion ça va très vite.

merci encore

Posté : 05 mai 2007, 13:53
par zeus
si tu as 2 tables, une pour le produit et une pour les critères, si tu veux ajouter un critère, il suffit d'ajouter une ligne dans la table des critères pour le produit en question.

Honnêtement, je te conseille de te renseigner sur la normalisation des bases de données. ;)