Dieser Artikel wurde von Ma Le aus der Huawei Cloud Community „ Paging Processing of Large Data in Applications “ geteilt.
Einführung
Die Darstellung großer Datenmengen gilt seit jeher als ein Problem, das es zu lösen gilt. Eine klassische Idee ist die stapelweise Darstellung und Verarbeitung.
1 Verarbeitung von Fremdschlüsseln während der Abfrage
Wenn das Modell Fremdschlüssel im Django-Modell verwendet, definieren Sie die entsprechende Operation über on_delete.
CASCADE: Kaskadenbetrieb. Bei Löschung der Fremdschlüsseldaten werden auch diese Daten gelöscht. PROTECT: Geschützt. Solange sich diese Daten auf die Daten des Fremdschlüssels beziehen, können die Fremdschlüsseldaten nicht gelöscht werden. Wenn sie zwangsweise gelöscht werden, meldet das Django-Framework einen Fehler. SET_NULL: Auf NULL gesetzt. Wenn die Fremdschlüsseldaten gelöscht werden, werden diese Daten auf NULL gesetzt, sofern diese Daten auf NULL gesetzt werden können. SET_DEFAULT: Legen Sie den Standardwert fest. Wenn die Fremdschlüsseldaten gelöscht werden, setzen Sie den Wert dieser Daten auf den Standardwert, sofern ein Standardwert vorhanden ist. SET()-Funktion: Wenn die Daten im Fremdschlüssel gelöscht werden, wird der Wert der SET-Funktion als Wert des Fremdschlüssels erhalten. Die Funktion Set() kann ein aufrufbares Objekt akzeptieren und der Rückgabewert des aufrufbaren Objekts wird als Ergebnis zurückgesetzt. DO_NOTHING: Es wird keine Aktion ausgeführt, alles hängt vom Verhalten auf Datenbankebene ab.
Einschränkungen auf Datenbankebene:
PESTRICT: Standardoption. Wenn Sie übergeordnete Tabellendatensätze löschen möchten und die untergeordnete Tabelle über zugehörige Datensätze verfügt, ist das Löschen nicht zulässig. NOACTION: Wie oben, zuerst Fremdschlüssel erkennen CASCADE: Wenn die übergeordnete Tabelle gelöscht und aktualisiert wird, werden auch die Verknüpfungsvorgänge der untergeordneten Tabelle gelöscht und aktualisiert. SET NULL: Wenn die übergeordnete Tabelle gelöscht oder aktualisiert wird, setzt die untergeordnete Tabelle das Fremdschlüsselfeld des zugehörigen Datensatzes auf Null, sodass es beim Entwerfen der untergeordneten Tabelle nicht ungleich null sein darf.
Diese Tools für Fremdschlüsselmethoden können Benutzern bei der Bewältigung von Abfrageaufgaben im Zusammenhang mit mehreren Tabellen helfen.
1.1 So fragen Sie die Paginierung in Django ab
In Anwendungen mit Paging-Abfragen kommen Abfragen wie LIMIT und OFFSET sehr häufig vor, und fast alle verfügen über eine ORDER BY-Klausel.
Wenn Sie die Indexsortierung verwenden, ist dies für die Leistungsoptimierung sehr hilfreich, andernfalls muss der Server viele Dateisortierungen durchführen.
Ein Hochfrequenzproblem besteht darin, dass der Offsetwert zu groß ist. Wenn die Abfrage LIMIT 10000 entspricht, werden 20, 10020 Zeilen generiert und die vorherigen 10000 Zeilen werden verworfen, was sehr teuer ist.
Wählen Sie * aus der Tabellenreihenfolge nach ID-Limit 10000, 20;
Es ist ganz einfach. Die Bedeutung dieser Anweisung besteht darin, 10.000+20 Datensätze abzufragen, die ersten 10.000 Datensätze zu entfernen und die letzten 20 Datensätze zurückzugeben.
Es besteht kein Zweifel, dass diese Abfrage Paging erreichen kann, aber je größer der Wert 10000 ist, desto geringer ist die Abfrageleistung, da MySQL alle 10000 + 20 Datensätze scannen muss.
Unter der Annahme, dass alle Seiten mit der gleichen Häufigkeit aufgerufen werden, durchsucht eine solche Abfrage im Durchschnitt die Hälfte der Datentabelle. Um sie zu optimieren, können Sie die maximale Anzahl der zugänglichen Seiten in paginierten Ansichten begrenzen oder große Batch-Abfragen effizienter gestalten.
Wenn in einer Tabelle viele Daten vorhanden sind, die die Abfragebedingungen erfüllen, müssen wir sie häufig nicht alle auf einmal herausnehmen, was eine große Herausforderung für die Abfrageeffizienz oder die Serverleistung darstellt: Im einfachsten Einkaufszentrum beispielsweise Angenommen, es gibt 10.000 Daten im Einkaufszentrum, aber wir sehen möglicherweise jeweils nur eine Seite im Frontend.
Wählen Sie * aus der Tabelle aus, wobei xxx="xxx" limit 10 ist;
Dies bedeutet, dass 10 Daten abgefragt werden, die die Bedingungen erfüllen.
Wählen Sie * aus der Tabelle aus, wobei xxx="xxx" limit 10 offset 10;
Dies bedeutet Paging, also das Abfragen der 11. bis 20. Daten, die die Bedingungen erfüllen.
Oder fragen Sie ab, indem Sie die maximale ID angeben
Wählen Sie * aus der Tabelle aus, in der ID > #max_id#, Reihenfolge nach ID-Limit n;
Diese Abfrage gibt auch die letzten n Datensätze zurück, es ist jedoch nicht erforderlich, die ersten m Datensätze wie bei Methode 1 zu scannen, sondern die maximale ID (oder minimale ID) der vorherigen Abfrage (vorherige Seite) muss in jeder Abfrage abgerufen werden Der Weg wird häufiger verwendet.
Das Problem bei dieser Abfrage besteht natürlich darin, dass wir die ID möglicherweise nicht abrufen können, wenn wir uns derzeit auf Seite 3 befinden und die Daten auf Seite 5 abfragen müssen nicht arbeiten.
Oder filtern Sie über eine Unterabfrage zunächst die ersten 10.000, suchen Sie die größte ID und wählen Sie dann die restlichen 20 aus, die den Anforderungen entsprechen.
select * from table where id > (select id from table order by id limit m, 1) limit n;
Diese Abfrage scannt auch die Feld-ID über eine Unterabfrage, da sie keine Tabellenzuordnung erfordert, sondern einen einfachen Vergleich darstellt. Dies ist eine empfohlene Verwendung, wenn die maximale ID auf der vorherigen Seite nicht bekannt ist.
Die Links-Rechts-Verbindungsmethode selbst hat möglicherweise eine schlechtere Leistung.
Es gibt auch die folgenden Unterabfragen: Join-Tabellen, Hinzufügen von Indizes zum schnellen Auffinden von Tupeln und anschließendes Lesen der Tupel
SELECT * FROM table WHERE id <= (SELECT id FROM table ORDER BY id DESC LIMIT (page-1)*pagesize ORDER BY id DESC LIMIT seitengröße)
rest_framework verfügt über ein integriertes Paging-Operationsmodul. Wenden wir es auf bestimmte Funktionen in Employee/views.py an
aus rest_framework.pagination Import PageNumberPagination @api_view(['GET', 'POST']) @permission_classes([CustomPermission]) def blog_api_view(request): „““““ if request.method == "GET": paginator = PageNumberPagination() # paginator.page_size = 1 Einstellung: Wir zeigen nur 1 Element pro Seite an. paginator.page_size = 2 task_objects = EmployeeSign.objects.all() result = paginator.paginate_queryset(task_objects, request)
Wenn kein Paging verwendet wird, werden alle Nachrichten auf derselben Seite angezeigt.
serializer = TaskSerializer(result, many=True) Antwort zurückgeben(serializer.data)
Zugriff auf Paging-Daten. Die Standardschnittstelle http://127.0.0.1:2001/api/tasks/ ist Paging 1
http://127.0.0.1:2001/api/tasks/?page=1 #2,3,4...
2 Zusammenfassung
Auch hier sind in Anwendungen mit paginierten Abfragen Abfragen mit LIMIT und OFFSET sehr häufig, und fast alle verfügen über eine ORDER BY-Klausel. Wenn Sie die Indexsortierung verwenden, ist dies für die Leistungsoptimierung sehr hilfreich, andernfalls muss der Server viele Dateisortierungen durchführen.
Ein Hochfrequenzproblem besteht darin, dass der Offsetwert zu groß ist. Wenn die Abfrage LIMIT 10000 entspricht, werden 20, 10020 Zeilen generiert und die vorherigen 10000 Zeilen werden verworfen, was sehr teuer ist.
Unter der Annahme, dass alle Seiten mit der gleichen Häufigkeit aufgerufen werden, durchsucht eine solche Abfrage im Durchschnitt die Hälfte der Datentabelle.
Um sie zu optimieren, können Sie die maximale Anzahl der zugänglichen Seiten in paginierten Ansichten begrenzen oder große Abfragen effizienter gestalten.
Das erste große Versionsupdate von JetBrains 2024 (2024.1) ist Open Source. Sogar Microsoft plant, dafür zu bezahlen. Warum steht es immer noch in der Kritik? [Wiederhergestellt] Tencent Cloud-Backend stürzte ab: Viele Servicefehler und keine Daten nach der Anmeldung an der Konsole. Deutschland muss auch 30.000 PCs von Windows auf Linux Deepin-IDE migriert haben Bootstrapping! Visual Studio Code 1.88 wurde veröffentlicht. Tencent hat Switch wirklich in eine „denkende Lernmaschine“ verwandelt. Der auf SQLite basierende Web-Client WCDB hat ein umfangreiches Upgrade erhalten.