2012-03-29 6 views
1

Ich habe folgende Abfrage, die mehr als eine Minute zur Ausführung benötigen, wie kann ich es optimieren. Es ist langsam wegen Bestellung von o.id desc, wenn ich es entfernen Abfrage führt es einige ms.Wie kann ich diese Abfrage optimieren, dauert mehr als eine Minute zum Ausführen


select o.*, per.email, p.name 
from order o 
inner join product p 
on o.product_id=p.id 
inner join person per 
on o.person_id=per.id 
order by o.id desc 
limit 100; 

Es folgt das Ergebnis erklären


1 SIMPLE p index PRIMARY FK2EFC6C1E5DE2FC 8 NULL 6886 Using index; Using temporary; Using filesort 
1 SIMPLE o ref FK67E9050121C383DB,FK67E90501FC44A17C FK67E90501FC44A17C 8 dev.p.id 58 
1 SIMPLE per eq_ref PRIMARY PRIMARY 8 dev.o.person_id 1 Using index 

Alle Tabellen sind InnoDB und schließt sich auf primärem und Fremdschlüssel. Andere als die Indizes sind auf E-Mail Spalte in Person und Status Spalte in Bestellen

Anzahl der Datensätze in jeder Tabelle

Person: 1.300.000 Produkt: 7000 Auftrag: 70.000

+1

schreiben Sie bitte Ihre Tabellenstruktur sowie –

+1

haben Sie Index für jedes Attribut hinzufügen Sie für die Beziehungen verwenden? (person_id, ID, Produkt_ID, ..)? – blejzz

+0

Bitte posten Sie alle Indizes, die in diesen Tabellen existieren – MatBailie

Antwort

1

Der Planer verwendet höchstwahrscheinlich nicht den limit Hinweis, um Zeilen vor dem Join aus der Auftragstabelle zu entfernen. Der Server muss den Join für alle Zeilen ausführen und dann nur einige wenige zurückgeben.

Versuchen Sie folgendes:

select o.* from 
(select * order order by id desc limit 100) o 
inner join product p 
on o.product_id=p.id 
inner join person per 
on o.person_id=per.id 
order by o.id desc limit 100; 

EDIT: Dies kann nur funktionieren, wenn es eine Einschränkung ist gewährleistet, dass entsprechende Reihen vorhanden sind, in der Produkt- und Personen Tabellen.

+0

Obwohl dies wahrscheinlich den Prozess beschleunigen würde, gibt es kein genaues Ergebnis. Was wäre, wenn eine dieser 100 Zeilen nicht verbunden werden könnte? Dann würden Sie 99 statt 100 Zeilen erhalten. –

+0

Sie haben Recht. Ich habe nicht darüber nachgedacht. Aber es hängt auch davon ab, wie die Tabellen eingerichtet sind.Wenn für diese Spalten eine Fremdschlüsseleinschränkung besteht, ist dies kein Problem. – Dojo

+0

Wenn Sie annehmen, dass alle diese Tabellen korrekt verbunden sind, wird dieser Join überhaupt nicht benötigt, da nur o. * Abgerufen wird. –

0

ja, ich verstehe Ihre Frage, in diesem Fall vor allem speichern Sie Ihre Abfrage in. SQL-Datei. Sie können sql Server-Dienstprogramm namens "Database Engine Tuning Advisor" im Menü Extras des Sql Server Management Studio verwenden.

Zuerst öffnen Sie den SQL Server und gehen Sie zu den Tools und wählen Sie die Option "Database Engine Tuning Advisor". Wählen Sie dann die Datei, die Sie zuvor gespeichert haben. Jetzt markieren Sie Ihre Datenbank, die Sie verwenden und Tabelle, die in der Abfrage verwendet wird und dann klicken Sie auf Start Analyse im Hauptmenü. es zeigt Ihnen mögliche index und statistics jetzt erstellen, um diese Empfehlung auf Ihre Abfrage anzuwenden, gehen Sie zu Action Manu und wählen Sie "Apply Recommandation", die Indizes und Statetics auf Ihrer Tabelle erstellen und die Ausführungszeit der Abfrage zu reduzieren.

+0

das OP verwendet MySQL – Simon

Verwandte Themen