Précédent   Forum du club des développeurs et IT Pro > Bases de données > MySQL
MySQL Forum d'entraide MySQL. Avant de poster -> FAQ MySQL, Tutoriels MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 11/12/2012, 17h44   #1
im-souf
Invité régulier
 
Homme
Inscription : octobre 2011
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : octobre 2011
Messages : 30
Points : 8
Points : 8
Par défaut Performance pour beaucoup de select sur un champs varchar

Bonjour, je construit une base de donnée pour un nouveau projet.
Ayant déjà été sujet à une base de donnée mal optimisée sur un gros projet qui amène à beaucoup de problèmes, je souhaite partir ici d'un bon pied. Je m'adresse ainsi à votre expertise aussi bien pour la structure que pour le moteur (innodb ou mysisam).

- 1ER POINT : Je met en place une base de donnée qui sera très peu mise à jour (UPDATE, INSERT, DELETE), mais très souvent lue (SELECT).

- 2EM POINT : j'ai besoin de stocker tout un ensemble de données à une url/exression(par exemple "mondomaine.com"/"monexpression") pour faire des satistiques dans le temps.

- 3EM POINT pour faire ces statistiques je dois figer pour une date, un lien, et une expression les données en question.
par exemple
- Le 11 décembre "mondomaine.com" pour "monexpression" à la colonne A qui vaut 5
- Le 12 décembre "mondomaine.com" pour "monexpression" à la colonne A qui vaut 6
- Le 13 décembre "mondomaine.com" pour "monexpression" à la colonne A qui vaut 10

- 4EM POINT : Les champs URL et expressions ne changent jamais.

Ainsi deux schémas me viennent à l'esprit :

SCHEMA 1


SCHEMA 2



Dans le schéma 1 j'aurai besoin d'une double jointure :

SELECT ... FROM statistics_web
JOIN site_web ON statistics_web.site_web_id_site=site_web.id_site
JOIN expression ON statistics_web.expression_id_expression=expression.id_expression
WHERE
expression.expression="monexpression"
AND site_web.url="monurl"
AND statistics_web.date>"...."
AND statistics_web.date<"...."

Vous savez sûrement aussi bien que moi, que ce schéma me permet de modifier facilement une url et une expression sur l'ensemble de la base.

Cependant je n'ai pas besoin de modifier cette url et expression, elles restent figées pour toujours. Ma question sur ce schéma est : est-ce que le fait de faire des jointures est performant et suffisament performant pour se justifier ? Peut être segmenter le tout en 3 requetes ? (une pour récuperer l'id de l'url, une pour récupérer l'id de l'expression, et la derniere pour récupérer mes données ?)




Dans le schéma 2 j'aurai seulement besoin d'effectuer un where, mais sur une grosse base textuelle, et là la grosse question : est ce que quand ma base comptera 100 000, 500 000, 1 000 000 d'entrée, la recherche texte sera toujours aussi performante ?

SELECT ... FROM statistics_web
WHERE
expression="monexpression"
AND url="monurl"
AND date>"...."
AND date<"...."


Mes connaissances en sql étant limitées à celles d'un développeur en soif d'en savoir plus, je n'arrive pas à peser le pour et le contre de chacun des schémas, ni du moteur adéquate.

Toute remarque étant la bievenue.
im-souf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 17h56   #2
Master-NiKo
Membre expérimenté
 
Avatar de Master-NiKo
 
Homme
Webmaster
Inscription : juin 2005
Messages : 153
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France

Informations professionnelles :
Activité : Webmaster
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : juin 2005
Messages : 153
Points : 551
Points : 551
1- Pour le choix entre myisam et innodb il faut choisir "INNODB"
"dans tous les cas j'ai envie de dire"
myisam est dépassé et INNODB va quasiment aussi vite maintenant...

2- Il est beaucoup mieux de faire une double jointure que 3 requêtes séparées. Ta base sera beaucoup plus performante car moins sollicité. Et ton schéma est beaucoup plus clair. Comme tu l'as dis c'est aussi beaucoup plus simple de modifié tes valeurs dans le 1er schéma même si t'en a pas besoin maintenant on ne sais jamais (merci de le prévoir pour le futur développeur qui te maudira si il a besoin de le faire).

Ce qu'il faut retenir c'est INNODB et faire le moins de requête possible.
Master-NiKo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 20h33   #3
ericd69
Expert Confirmé
 
Avatar de ericd69
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 1 815
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 1 815
Points : 3 118
Points : 3 118
salut,

je suis d'accord avec boboash pour les jointures, la solution 1 sera plus compacte et donc performante...

après pour le moteur de table ça dépend je te conseille de lire des choses sur les partitions avec mysql pour la table statistiques_web et si tu ne les utilises pas innodb avec des index bien placés pour toutes les tables...
__________________
soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 22h52   #4
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 666
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 13 666
Points : 25 513
Points : 25 513
Envoyer un message via MSN à CinePhil
1) InnoDB.
Tu auras les clés étrangères et donc l'assurance d'avoir des données cohérentes.

2) Schéma 1.
Notamment, ta table des expressions, si elle n'est pas trop grosse, sera toujours en mémoire et les données seront donc lues très rapidement. Alors que la répétition des données textuelles alourdit inutilement la BDD et empêche justement cette présence des données en mémoire lorsque la BDD grossit.

3) Jointures.
Il ne faut pas avoir peur des jointures, c'est l'opération la plus optimisée dans un SGBD.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 22h13   #5
im-souf
Invité régulier
 
Homme
Inscription : octobre 2011
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : octobre 2011
Messages : 30
Points : 8
Points : 8
Bonjour, à priori vos avis semblent converger. Merci bien
im-souf est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 02h42.


 
 
 
 
Partenaires

Hébergement Web