optimisation des requetes SQL

optimisation des requetes SQL - SQL/NoSQL - Programmation

Marsh Posté le 18-01-2007 à 10:09:35    

Bonjour a tous :)
 
J'ai une petite question a vous poser, ca peut sembler idiot, mais , quand on créé des index sur une tables, faut-il spécifier quoi que ce soit dans la requete SQL pour que l'index soit utilisé ou bien est-ce fait par défaut dans le mysql_query() ? Car en delphi j'ai bossé avec un serveur oracle et il fallait tout expliciter...
 
Merci de vos réponses :)


Message édité par the_bigboo le 18-01-2007 à 16:37:35
Reply

Marsh Posté le 18-01-2007 à 10:09:35   

Reply

Marsh Posté le 18-01-2007 à 11:31:47    

Avec mysql, t'as deux solutions, soit tu le laisses utiliser les index qu'il juge utile, soit tu lui indique lesquels utiliser (voir doc pour plus de détail)
En général, il n'y a pas besoin de lui préciser les index à utiliser et en pratique, je n'ai jamais eu besoin de lui forcer la main.

Reply

Marsh Posté le 18-01-2007 à 11:50:56    

ce qui m'intrigue c'est que j'ai une table avec environ 50000 enregistrements, et le champs sur lequel je fais des requetes et le champ cat_id, qui est de type INT... Mais je n'ai vu aucune de différence  avec ou sans index :/

Reply

Marsh Posté le 18-01-2007 à 11:57:36    

Je en sais pas si ca marche en php, mais avec le "mysqlquerybrowser" et autres programmes du genre, on peut obtenir des détails sur l'exécution de la requette en rajoutant le mot clé "explain" dans la requette.
exemple : "explain select * from matable order by id".
 
Si tu ne peux pas faire ça mais que t'as accés aux fichiers de log de mysql, tu peux essayer de voir si ta requette est indiqué comme étant une "requette sans index" (a condition que ces requettes là soit logué)

Reply

Marsh Posté le 18-01-2007 à 12:32:39    

50000 enregistrements, c'est pas très significatif et faut voir la complexité de la requête...

Reply

Marsh Posté le 18-01-2007 à 13:46:56    

c'est un select tout bete, mais en fait ce select comporte un autre champ qui le lie par une clé étrangere a une autre table, et auquel je fais appel pour faire ma jointure, j'ai mit des index sur tous ces champs qui snt de type INT et très souvents appelés dans la clause WHERE de mes requetes, et fait je fais un SELECT A.* FROM .... AS A INNER JOIN ... As B ON (A.sid = B.id ) WHERE B.cat_id="..."

 

et pour afficher 50 enregistrements, ca prends 10/15 secondes ! :ouch:
Je vais finir par croire que ca a été codé avec les pieds :pfff:


Message édité par the_bigboo le 18-01-2007 à 13:47:05
Reply

Marsh Posté le 18-01-2007 à 13:51:47    

bizarre, en effet... Par contre, tu ne devrais pas mettre * dans ton select.

Reply

Marsh Posté le 18-01-2007 à 16:01:34    

Ben si car j'utilise tous les champs !

Reply

Marsh Posté le 18-01-2007 à 16:03:35    

PUTAIN MAIS QU4EST CE QUE CE TOPIC FOUT EN CAT PHP PUTAIN DE BORDEL 0 QUEUE§§§§§§§§§§§[/MECHANT]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 18-01-2007 à 16:07:30    

skeye a écrit :

PUTAIN MAIS QU4EST CE QUE CE TOPIC FOUT EN CAT PHP PUTAIN DE BORDEL 0 QUEUE§§§§§§§§§§§[/MECHANT]


 
Il a dit mysql_query() [:cbrs]
(moi aussi j'ai insulté cet égorgeur de chèvres, mais il y avait un piège, j'ai donc effacé mon post)

Reply

Marsh Posté le 18-01-2007 à 16:07:30   

Reply

Marsh Posté le 18-01-2007 à 16:08:22    

(et depuis quand il faut expliquer à oracle qu'il faut utiliser les indexes?[:mlc] [:mlc] [:mlc])


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 18-01-2007 à 16:09:37    

skeye a écrit :

PUTAIN MAIS QU4EST CE QUE CE TOPIC FOUT EN CAT PHP PUTAIN DE BORDEL 0 QUEUE§§§§§§§§§§§[/MECHANT]


Car le principe c'est de savoir si je peux tirer parti des index dans mes mysql_query comme je le fais en delphi avec de l'oracle... Car je constate aucune amélioration avec ou sans index...

Reply

Marsh Posté le 18-01-2007 à 16:09:52    

skeye a écrit :

(et depuis quand il faut expliquer à oracle qu'il faut utiliser les indexes?[:mlc] [:mlc] [:mlc])


En delphi..

Reply

Marsh Posté le 18-01-2007 à 16:11:55    

the_bigboo a écrit :

Car le principe c'est de savoir si je peux tirer parti des index dans mes mysql_query comme je le fais en delphi avec de l'oracle... Car je constate aucune amélioration avec ou sans index...


 


 
En delphi, en C, en php ou ce que tu veux, les indexes c'est du sgbd. Point barre.


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 18-01-2007 à 16:37:25    

soit, je déplace... devant une telle preuve de respect :pfff:

Reply

Marsh Posté le 18-01-2007 à 16:38:18    

the_bigboo a écrit :

soit, je déplace... devant une telle preuve de respect :pfff:


 
Ouiiiin les méchants, ouiiiiin  [:zytrasnif]

Reply

Marsh Posté le 18-01-2007 à 16:40:31    

Le premier qui manque de respect aux autres c'est celui qui prend pas la peine de poster au bon endroit.[:dawa]
 
Et quelle que soit la méthode utilisée pour exécuter ta requête, si ton sgbd voit des indexes utilisables il les utilise, point barre.


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 22-01-2007 à 15:47:23    

d'un autre côté, c'est Delphi...
 
tu sais, Delphi ça a été développé par des Voodoo canibales. faut pas s'attendre à ce que ça marche normalement :D
 
je pense surtout qu'en Delphi, tout comme en VB ou en C# par exemple, on peut parfaitement exécuter les jointures et les filtres dans le programme et non sur le serveur (c'est gore mais c'est comme ça), ce qui oblige à créer ses propres index dans son programme.
 
m'enfin bref, tout ça pour dire que non, tu mets rien et ça va marcher tout seul. tu ne vois pas de différence parceque : 1/ 50 000 lignes c'est pas suffisant 2/ si ta requête retourne 10 000 lignes, c'est le fait de les lire physiquement qui prend du temps, pas de les retrouver.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed