Ich habe ein Modell namens Valor. Valor hat einen Roboter. Ich frage so:
%Vor%um die letzte Valor der r Roboter zu bekommen. Valor.objects.filter (roboter = r) .count () ist etwa 200000 und das Abrufen der letzten Elemente dauert etwa 4 Sekunden in meinem PC.
Wie kann ich es beschleunigen? Ich frage den falschen Weg?
Es klingt, als wäre Ihr Datensatz groß genug, um die Dinge ein wenig zu denormalisieren. Haben Sie versucht, das letzte Valor-Objekt im Robot-Objekt zu verfolgen?
%Vor%Und dann verwenden Sie eine post_save Signal , um das Update zu machen.
%Vor%Sie zahlen die Kosten für eine zusätzliche Datenbanktransaktion, wenn Sie die Valor-Objekte erstellen, aber die last_valor-Suche wird blitzschnell ausgeführt. Spielen Sie damit und sehen Sie, ob sich der Kompromiss für Ihre App lohnt.
Wenn keiner der früheren Vorschläge funktioniert, würde ich vorschlagen, Django aus der Gleichung zu nehmen und diesen rohen SQL gegen Ihre Datenbank laufen zu lassen. Ich schätze Ihre Tabellennamen, also müssen Sie möglicherweise entsprechend anpassen:
%Vor% Ist das langsam? Wenn ja, lassen Sie Ihr RDBMS (MySQL?) Den Abfrageplan für Sie erklären. Dies wird Ihnen sagen, ob es vollständige Tabellen-Scans macht, die Sie offensichtlich nicht mit einer so großen Tabelle wollen. Sie können Ihre Frage auch bearbeiten und das Schema für die Tabelle valor
für uns einfügen.
Sie können auch die SQL sehen, die Django auf diese Weise erzeugt (unter Verwendung der von Peter Rowell bereitgestellten Abfrage):
%Vor%Stellen Sie sicher, dass SQL der oben angegebenen "rohen" Abfrage ähnelt. Sie können Ihrem RDBMS auch diesen Abfrageplan erläutern.
Nun, es gibt keine order_by-Klausel, also frage ich mich, was Sie mit "last" meinen. Angenommen du meintest 'zuletzt hinzugefügt',
%Vor%könnte die Arbeit für Sie erledigen.
Gibt es eine Limit-Klausel in Django? Auf diese Weise können Sie die db haben, einfach einen einzelnen Datensatz zurückgeben.
mysql
%Vor%SQL Server
%Vor%oracle
%Vor%Ich weiß, dass dies nicht in Django übersetzt wird, aber jemand kann zurückkommen und das aufräumen.
Der richtige Weg, dies zu tun, besteht darin, die eingebaute Methode QuerySet neustart () zu verwenden und sie mit der Spalte (Feldname) zu füllen, nach der sie sortieren soll. Der Nachteil ist, dass es nur nach einer einzelnen db-Spalte sortieren kann.
Die aktuelle Implementierung sieht so aus und ist im selben Sinne optimiert wie @ Aarons Vorschlag.
%Vor%Tags und Links django optimization django-queryset