2010-10-10 3 views
1

J'ai un problème étrange avec ma requête essayant de joindre 3 tables. Les tables décrivaient:Comportement étrange de JOIN

2 tables similaires (ce entr_es):

Field Type Null Key Default Extra 
espid int(11) NO PRI NULL auto_increment 
haslo text NO MUL NULL 
kat int(11) NO NULL 

La deuxième table semble le même, sauf la première colonne whis est nommé IDPol.

La troisième table est:

Field Type Null Key Default Extra 
polid int(11) NO PRI NULL 
espid int(11) NO PRI NULL 

Et voici les questions:

Le premier:

SELECT entr_pl.haslo AS srchaslo, entr_es.haslo AS trghaslo 
FROM entr_es, entr_pl, rel_pl_es 
WHERE entr_pl.polid=rel_pl_es.polid 
AND rel_pl_es.espid=entr_es.espid 
AND entr_pl.haslo LIKE "%ludzk%" 

fonctionne rapidement, environ 0,2 sec. ce qui me suffit.

Mais l'autre, ce qui est à peu près le même, mais inverse:

SELECT entr_es.haslo AS srchaslo, entr_pl.haslo AS trghaslo 
FROM entr_es, entr_pl, rel_pl_es 
WHERE entr_pl.polid=rel_pl_es.polid 
AND rel_pl_es.espid=entr_es.espid 
AND entr_es.haslo LIKE "%hum%" 

fonctionne mal - les résultats sont OK, mais la requête prend environ 2,2 pour exécuter et je ne sais pas pourquoi. J'ai regardé EXPLAIN, mais la seule chose que j'ai trouvée est que la deuxième requête, la lente, est "using temporary". Je ne sais pas pourquoi. Je suis sûr qu'il y a quelque chose d'évident que je ne peux pas voir, peut-être qu'il y a aussi un moyen de simplifier ces requêtes.

S'il vous plaît aider et un grand merci à l'avance, Cordialement,

Kamil

=======

Je suis terriblement désolé - je suis allé throught une fois de plus et la problème de ralentissement est ailleurs.

Il est la clause

ORDER BY srchaslo 

à la fin de chaque requête. Je l'ai écrit dans mon premier post en pensant que ce n'était pas pertinent, mais ça l'est. Cela fonctionne bien et rapidement sur la première requête, mais ralentit terriblement sur l'autre. J'ai essayé d'ajouter l'instruction COLLATE suivie de différents encodages, mais cela ne fonctionne pas. Ensuite, j'ai essayé d'encapsuler cette requête dans SELECT * FROM (requête) AS t1 et de lancer la commande ORDER BY en dehors de(), mais cela ne marchera pas non plus. La requête est aussi lente qu'elle l'était. Je n'ai pas d'idées pour résoudre ce problème.

Répondre

2

Vous avez besoin d'un indice supplémentaire sur rel_pl_es:

create index idx2 on rel_pl_es(espid,polid); 

Pour la deuxième requête, l'index existant ne fonctionne pas.

+0

C'est tout! Cela fonctionne parfaitement! Comment l'avez-vous découvert? – Basakatu

+0

En tout cas, je vous remercie pour votre aide et votre temps pour résoudre mon problème. Merci à Lieven aussi. Vous êtes tous super! – Basakatu

+0

J'ai eu un problème similaire il y a quelques temps. Je suis content que ça a marché pour toi. – Martin