Optimisation sql


xTrade
WRInaute passionné
WRInaute passionné
 
Messages: 2289
Inscription: 11 Déc 2006

Optimisation sql

Message le Lun Fév 12, 2007 17:55

Supposons que je crée une table contenant tous les os de mes visiteurs, table utilisée à chaque visite.

Si je réordonne régulièrement cette table, avec l'os le plus fréquent en 1er et le moins fréquent en dernier, est-ce que cela a une influence sur la vitesse de recherche (vu que la valeur la plus fréquente est en 1ère position) ?


arnaudmn
WRInaute passionné
WRInaute passionné
 
Messages: 1542
Inscription: 11 Mai 2005

Message le Lun Fév 12, 2007 17:57

L'ordre d'affichage et l'ordre de stockage n'ont rien a voir.
Pour trier il faut des index. Si tu as un index sur l'os, la recherche ira plus vite. Et l'insertion sera plus lente.


xTrade
WRInaute passionné
WRInaute passionné
 
Messages: 2289
Inscription: 11 Déc 2006

Message le Lun Fév 12, 2007 18:00

Ok.

Et si je mets l'os en clé primaire, c'est utile?


arnaudmn
WRInaute passionné
WRInaute passionné
 
Messages: 1542
Inscription: 11 Mai 2005

Message le Lun Fév 12, 2007 18:05

xTrade a écrit:Ok.

Et si je mets l'os en clé primaire, c'est utile?


Ca dépend de ce que tu mets dans ta table :-)
Si tu veux faire une table dans laquelle tu mémorise juste le nombre de visite par os, avec comme champ "os" et "quantite" par exemple, oui, il _faut_ mettre os comme clé primaire. La clé primaire c'est ce qui identifi de manière unique une ligne de la table, donc dans ce cas c'est "os" qui est l'identifiant.


xTrade
WRInaute passionné
WRInaute passionné
 
Messages: 2289
Inscription: 11 Déc 2006

Message le Lun Fév 12, 2007 18:15

arnaudmn a écrit:Ca dépend de ce que tu mets dans ta table :-)
Si tu veux faire une table dans laquelle tu mémorise juste le nombre de visite par os, avec comme champ "os" et "quantite" par exemple, oui, il _faut_ mettre os comme clé primaire. La clé primaire c'est ce qui identifi de manière unique une ligne de la table, donc dans ce cas c'est "os" qui est l'identifiant.


En fait, ce que je veux mettre dans la table, c'est la correspondance entre "user agent" et os+browser, sans à avoir à tout rechercher (comme le fait le script sur lequel je me base)

En gros, dès que je récupère le "user agent", je veux regarder le plus rapidement possible dans la table s'il existe, puis récupérer l'id de l'os et du browser (et l'ajouter dans le cas où l'agent n'était pas présent)

Donc dans ce cas là, vaut-il mieux index+clé primaire (si c'est possible) ou bien clé primaire sur l'agent?


arnaudmn
WRInaute passionné
WRInaute passionné
 
Messages: 1542
Inscription: 11 Mai 2005

Message le Lun Fév 12, 2007 18:19

xTrade a écrit:Donc dans ce cas là, vaut-il mieux index+clé primaire (si c'est possible) ou bien clé primaire sur l'agent?


Une clé primaire est obligatoirement indexée :-)


xTrade
WRInaute passionné
WRInaute passionné
 
Messages: 2289
Inscription: 11 Déc 2006

Message le Lun Fév 12, 2007 18:24

arnaudmn a écrit:
xTrade a écrit:Donc dans ce cas là, vaut-il mieux index+clé primaire (si c'est possible) ou bien clé primaire sur l'agent?


Une clé primaire est obligatoirement indexée :-)


Ah! Ok, merci!
J'en apprends tous les jours!

fablezouave
WRInaute discret
WRInaute discret
 
Messages: 109
Inscription: 20 Déc 2006

Message le Lun Fév 12, 2007 18:47

salut

Je dirais même plus, une clé primaire, c'est un INDEX (comme les autres) qui a une contrainte UNIQUE, c'est à dire qu'il ne pourra pas y avoir 2 lignes contenant 'windows' dans ta table. Après c'est à toi de voir si tu stockes 1 ligne par visiteur, ou une ligne par OS .... mais dans tous les cas, il te faut indexer cette colonne.

fab


xTrade
WRInaute passionné
WRInaute passionné
 
Messages: 2289
Inscription: 11 Déc 2006

Message le Mar Fév 13, 2007 0:04

Merci pour vos réponses.

Et donc une nouvelle question :wink:

J'ai besoin d'additionner, pour toutes les valeurs de la table, une colonne 'hits'.

Est-ce plus rapide d'utiliser "SELECT SUM(hits) FROM table" ou bien un "SELECT hits FROM table" puis d'additionner avec une boucle?

Je pencherais pour la 1ère solution, mais comme je découvre mysql...


arnaudmn
WRInaute passionné
WRInaute passionné
 
Messages: 1542
Inscription: 11 Mai 2005

Message le Mar Fév 13, 2007 13:29

xTrade a écrit:Est-ce plus rapide d'utiliser "SELECT SUM(hits) FROM table" ou bien un "SELECT hits FROM table" puis d'additionner avec une boucle?


La première est plus rapide. Ca evite au moteur de gérer un pointeur et de faire une copie du résultat de la requete en mémoire.


xTrade
WRInaute passionné
WRInaute passionné
 
Messages: 2289
Inscription: 11 Déc 2006

Message le Jeu Fév 15, 2007 20:15

Toujours dans ma découverte de Mysql, j'ai une nouvelle question :wink:

J'ai vu sur un forum qu'il conseillaient d'utiliser LIMIT 0,1 lorsqu'on était sur que la recherche ne donnait qu'un résultat.

Si je fais ma recherche sur une clé primaire, est-ce utile?

Merci!


arnaudmn
WRInaute passionné
WRInaute passionné
 
Messages: 1542
Inscription: 11 Mai 2005

Message le Jeu Fév 15, 2007 20:31

LIMIT 0,1 c'est pour forcer le moteur a ne pas chercher plus de 1 enregistrement. Si tu fais une requete sur une clé primaire, donc unique, ça ne sert à rien.
Pour ma part je l'ai jamais utilisé quand je sais que j'ai au plus un résultat.


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité