2010-11-29 6 views
2

Je vais avoir deux tables, je dois sélectionner des données jointes à la fois d'entre euxMySQL - SELECT + JOIN + ORDER BY la performance

SELECT f.* 
FROM file_data f 
JOIN subscriptions s ON f.uid = s.elementid 
WHERE s.uid = 119762 AND f.private=0 
ORDER BY f.date DESC 

Maintenant, même pour un petit ensemble de données, la requête reprend une seconde. Ceci est dû au fait que 'filesort' et 'temporary' sont utilisés sur les "abonnements", provoqués par ORDER BY f.date (supprimer cette condition fait chuter l'heure sous 0.01s)

Quelqu'un peut-il me dire comment accélérer? la requête?

est ici le résultat de EXPLIQUER

id select_type table type possible_keys key   key_len ref   rows Extra 
1 SIMPLE   s  ref uid_elementid uid_elementid 4  const   171 Using index; Using temporary; Using filesort 
1 SIMPLE   f  ref uid_uname  uid_uname  5  s.elementid 22 Using where 

Répondre

1

Vous devriez mettre un index sur f.date

+0

il y a déjà index sur file_data.date, je ne sais pas pourquoi pas répertorié comme clé possible ... Lorsque – migajek

+1

nombre d'enregistrements est bas, l'index ne va pas aider. – Aliostad

+0

Vous devez également mettre un index sur f.uid, s.elementid, s.uid et f.private. Et en fonction de ce que vous aimez sélectionner un LEFT JOIN pourrait être suffisant et plus rapide. – JochenJung

1

Lorsqu'un index aide d'une commande par non-trivial à prévoir. Il est très rarement aussi simple que "indexer les champs dans le order by". This link a les détails nitty-graveleux. Si vous pensez avoir une indexation correcte et que l'optimiseur ne décide pas de les utiliser, utilisez un index hint pour suggérer l'index au serveur de base de données.

0

j'ai rencontré le même problème, voici ma solution:

SELECT f.* 
FROM (SELECT * FROM file_data WHERE `private`=0 ORDER BY `date` DESC) f 
JOIN subscriptions s ON f.uid = s.elementid 
WHERE s.uid = 119762