Bonjour à tous,

Mon problème est le suivant. J'ai une base de donnée de plusieurs milliers d'utilisateurs, j'ai un panneau de recherche avec 2 champs input simples. Ce panneau propose aussi une recherche avancée qui vous offre la possibilité de filtrer votre recherche selon les critères cochés. Par exemple, je ne veux que des gens grands ET avec de grande jambes.
Pour ce faire j'utilise un EXIST (SELECT) fois le nombre de checkbox. Pour 500/1000 utilisateurs ok, mais à présent cela ralentit très fortement l'application. Je me tourne vers vous pour une éventuelle solution. J'ai déjà testé quelques solutions et écumé ce bon vieux google mais rien... Une idée?

Ma requête (avec quelques jointures)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
SELECT DISTINCT(tb_user.user_id), ...
 
FROM tb_user
 
INNER JOIN tb_pictures ON tb_user.user_id = tb_pictures.user_id
INNER JOIN ... 
 
WHERE tb_pictures.picture_select='1' AND tb_user.user_enabled='1' AND tb_user.user_id != 'e38c6ff6c54abb88d6d387d37ca28661' AND tb_search.search_iam = '1' AND tb_search.search_lookfor_boy = '1' AND tb_user.user_birthday <= '19900101' AND EXISTS (SELECT * FROM tb_join_perso WHERE tb_user.user_id = tb_join_perso.user_id AND tb_join_perso.perso_id = 1)AND EXISTS (SELECT * FROM tb_join_perso WHERE tb_user.user_id = tb_join_perso.user_id AND tb_join_perso.perso_id = 2) AND tb_address.country_id = '1' AND tb_cities_us.states_id = '8' LIMIT 0, 9 ;
Cela m'affiche bien une liste de résultats qui possèdent l'id 1 et 2.

Un ami m'a conseillé ceci:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
SELECT  DISTINCT(tb_user.user_id),  ...
 
FROM  tb_user, ...
 
WHERE 
 tb_user.user_id = tb_pictures.user_id AND
 tb_user.user_id = tb_search.user_id AND
...
 
 AND (tb_join_perso.perso_id = 1 AND tb_join_perso.perso_id = 2)
 AND tb_address.country_id = '1' AND 
 tb_cities_us.states_id = '8' LIMIT 0, 9 ;
La requête s'exécute mais agit comme un OU. J'ai des résultats qui on l'id 1 OU 2 mais pas les 2.

Au final donc, je recherche un moyen de remplacer ces EXIST(). Car ces sous requêtes sont beaucoup trop lourdes...

D'avance merci à vous!