2011-10-01 4 views
1

J'ai cette requêteComment optimiser cette requête mysql?

SELECT id FROM btn 
WHERE parentid =0 
AND (mem_id =ANY(SELECT mem_id FROM network WHERE frd_id='401') || mem_id ='401') 
ORDER BY btn.date DESC LIMIT 0,20 

& cette requête

SELECT mem_id FROM net WHERE frd_id='401' 

me donne le résultat comme celui-ci

mem_id 
34 
45 
633 
24 
22 

Je souhaite optimiser la requête principale ci-dessus qui prend actuellement 46 secondes après balayage 13,373 enregistrements de btn tableau

Veuillez me suggérer hw puis-je optimiser cette requête?

thnks

+0

Nous ne pouvons pas vraiment aider sans connaître votre structure de base de données. – Bojangles

+3

Avez-vous des index? Si oui où? Que montre 'EXPLAIN'? – Shef

+0

champ '\t type \t Null \t Clé \t Par défaut \t supplémentaire id \t bigint (20) \t NO \t PRI \t (NULL) \t auto_increment' – Sparkx

Répondre

0
SELECT DISTINCT b.id FROM btn b 
INNER JOIN network n ON (n.mem_id = b.mem_id) 
WHERE b.parentid = '0' 
AND ('401' IN (n.frd_id, n.mem_id)) 
ORDER BY b.date DESC 
LIMIT 20 OFFSET 0 

Assurez-vous d'avoir des indices sur

btn.mem_id, btn.parentid, btn.date 
network.mem_id, network.frd_id 
+0

son donnant des résultats en double – Sparkx

1

Vous voulez indexer les valeurs que vous effectuez une recherche sur. Ainsi, sur la base des deux ci-dessus:

parentid, frd_id, mem_id 

Cela devrait aider considérablement ...