2009-08-11 8 views
0

J'essaie d'interroger les dernières entrées sur deux tables différentes comme une requête:Deux requêtes lentes Table: Trier le fichier Problème

SELECT 
    news.title AS news_title, 
    news.sid AS news_id, 
    downloads.lid AS download_id, 
    downloads.title AS download_title 
FROM 
    news, 
    downloads 
ORDER BY 
    news_id DESC, 
    download_id DESC 
    LIMIT 0,10 

La requête est vraiment lent et il dit "Using temporary; Using filesort" quand je fais un EXPLAIN. Chaque table contient environ 2 000 éléments. L'index de clé primaire de chaque table est l'ID (lid et sid).

Répondre

2

Vous n'avez aucune condition de jointure de sorte qu'il joint chaque ligne dans les nouvelles avec chaque ligne de téléchargements. C'est ce qu'on appelle une jointure croisée ou un produit cartésien. Donc, si les nouvelles ont 1000 lignes et que les téléchargements ont 3000 lignes, vous obtiendrez 3 millions de lignes retournées.

Vous voulez probablement quelque chose comme ceci:

SELECT news.title AS news_title, 
     news.sid AS news_id, 
     downloads.lid AS download_id, 
     downloads.title AS download_title 
FROM news n 
JOIN downloads d ON n.some_column = d.join_column /* fill this part in */ 
ORDER BY news_id DESC,download_id DESC LIMIT 0,10 

Selon toute vraisemblance, une colonne de jointure sera une clé primaire d'une colonne et une clé étrangère dans l'autre. Oh, assurez-vous que la clé étrangère est également indexée.

+0

Et c'est pourquoi vous utilisez 'jointure interne 'au lieu d'une simple virgule lors de la jonction de tables. L'ancien force une condition de jointure. – Eric

+0

Ou vous pouvez, d'un autre côté, savoir ce que vous faites, @Eric :-) Et, @cletus a raison, à 2000 lignes chacune, quatre millions de lignes à trier avant de saisir le premier 10. – paxdiablo

+0

@Pax: Tout Je peux faire pour me protéger de moi est un gagnant dans mon livre. – Eric

0

Vous voudrez rejoindre les tables. Ce que vous avez fait est créé une requête qui crache un produit cartésien - chaque ligne d'une table et chaque rangée de l'autre. C'est pourquoi c'est lent.

Vous souhaitez ajouter une table WHERE A.key = table b.field pour les joindre.

Lance

Questions connexes