2009-08-11 4 views
0

Ich versuche, die neuesten Einträge auf zwei verschiedenen Tabellen als eine Abfrage abzufragen:Zwei Table Query Langsam: Datei sortieren Problem

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 

Die Abfrage ist wirklich langsam, und es sagt "Using temporary; Using filesort", wenn ich ein EXPLAIN tun. Jeder Tisch hat ungefähr 2.000 Gegenstände. Der Primärschlüsselindex jeder Tabelle ist die ID (lid und sid).

Antwort

2

Sie haben keine Join-Bedingung, daher wird jede Zeile in Nachrichten mit jeder Zeile in Downloads verknüpft. Dies wird als Cross Join oder Cartesian Produkt bezeichnet. Wenn die Nachrichten also 1000 Zeilen haben und die Downloads 3000 Zeilen haben, werden 3 Millionen Zeilen zurückgegeben.

Sie wollen wahrscheinlich etwas wie folgt aus:

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 

Aller Wahrscheinlichkeit nach kommen eine Spalte wird ein Primärschlüssel einer Spalte und einem Fremdschlüssel in der anderen sein.

Oh, stellen Sie sicher, dass der Fremdschlüssel auch indiziert ist.

+0

Und deshalb verwenden Sie 'innere Verbindung' statt nur ein Komma, wenn Sie Tabellen verbinden. Der Former erzwingt eine Join-Bedingung. – Eric

+0

Oder Sie könnten auf der anderen Seite wissen, was Sie tun, @Eric :-) Und, @cletus hat Recht, bei 2000 Zeilen jeweils das ist vier Millionen Zeilen zu sortieren, bevor die ersten 10 greifen. – paxdiablo

+0

@Pax: Anything Ich kann tun, um mich vor mir zu schützen ist ein Gewinner in meinem Buch. – Eric

0

Sie möchten die Tabellen beitreten. Was Sie getan haben, ist eine Abfrage erstellt, die ein kartesisches Produkt ausspuckt - jede Zeile aus einer Tabelle und jede Zeile aus der anderen. Deshalb ist es langsam.

Sie möchten eine WHERE-Tabelle A.key = Tabelle b.field hinzufügen, um sie zu verbinden.

Lance