Vorwort Um bei der Backend-Entwicklung zu verhindern, dass zu viele Daten gleichzeitig geladen werden, was zu übermäßigem Speicher- und Festplatten-E/A-Overhead führt, ist häufig eine Paging-Anzeige erforderlich. Zu diesem Zeitpunkt wird das Schlüsselwort LIMIT von MySQL benötigt. Aber glauben Sie, dass mit LIMIT-Paging alles gut gehen wird? Es ist zu neu und zu einfach. Bei großen Datenmengen ist Deep Paging wahrscheinlich ein Problem, das LIMIT verursachen kann. Fall Hier nehme ich die Anzeige der E-Commerce-Bestelldetails als Beispiel und die neue Tabelle sieht wie folgt aus: Tabelle „cps_user_order_detail“ erstellen ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Primärschlüssel', `user_id` varchar(32) NOT NULL DEFAULT '' KOMMENTAR 'Benutzer-ID', `order_id` bigint(20) DEFAULT NULL COMMENT 'Bestell-ID', `sku_id` bigint(20) unsigned NOT NULL COMMENT 'Produkt-ID', `order_time` datetime DEFAULT NULL COMMENT 'Bestellzeit, Format jjjj-MM-tt HH:mm:ss', Primärschlüssel (`id`), SCHLÜSSEL `idx_time_user` (`order_time`,`user_id`) MIT BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='Benutzerbestelldetails'; Fügen Sie dann manuell 1,2 Millionen Datensätze in die Tabelle ein. Jetzt gibt es eine Anforderung: Zeigen Sie die Bestelldetails des Benutzers seitenweise an, und zwar in umgekehrter Reihenfolge der Bestellzeit. Die Tabellenstruktur ist schlank und die Anforderungen sind einfach. Also habe ich den Code schnell fertig geschrieben und zum Testen online gestellt. Anfangs lief alles normal, doch mit zunehmendem Auftragsvolumen wurde das System zunehmend langsamer und es wurden hin und wieder mehrere langsame Abfragen gemeldet. An diesem Punkt sollten Sie denken, dass es sich um ein LIMIT-Offset-Problem handelt. Ja, es liegt nicht daran, dass Ihr SQL nicht schön genug ist, sondern am Mechanismus von MySQL selbst. Hier nehme ich einfach zwei SQL-Anweisungen als Beispiel, wie in der folgenden Abbildung gezeigt, die von dem Positionsoffset 100 bzw. 1 Million aus paginieren. Sie können sehen, dass der Zeitunterschied sehr groß ist. Darin ist die Zeit für andere Datenberechnungen und -verarbeitungen nicht enthalten. Eine einzelne SQL-Abfrage dauert mehr als eine Sekunde, was bei den den Benutzern zur Verfügung gestellten Funktionen nicht tolerierbar ist (im E-Commerce ist es oft erforderlich, dass die Reaktionszeit einer Schnittstelle 200 ms nicht überschreitet). Hier sehen wir uns den Ausführungsplan an, wie unten dargestellt: Hier stellen wir zunächst die möglichen Werte und Bedeutungen der Spalte Extra im Ausführungsplan vor:
Wenn man das Bild oben betrachtet, führt dieselbe Anweisung allein aufgrund der unterschiedlichen Offsets zu einem großen Unterschied im Ausführungsplan (erlauben Sie mir, ein wenig zu übertreiben). In der ersten Anweisung ist der Wert der Spalte LIMIT 100,6type range, was auf einen Bereichsscan hinweist. Seine Leistung ist eine Stufe niedriger als die von ref, es wird jedoch auch berücksichtigt, dass der Index verwendet wird, und es wird auch Index-Pushdown angewendet: Das heißt, der Index wird zum Bestellzeitpunkt nach WHERE gelöscht und ausgewählt, und das nachfolgende ORDER BY wird ebenfalls basierend auf Index-Pushdown optimiert, was synchron ausgeführt wird, wenn die WHERE-Bedingung gefiltert wird (ohne zur Tabelle zurückzukehren). Optimierung Nachdem die Ursache analysiert wurde, wie können wir LIMIT Deep Paging in der tatsächlichen Entwicklung optimieren? Hier gebe ich Ihnen zwei Lösungen. AUSWÄHLEN * VON cps_user_order_detail d WO d.id > #{maxId} UND d.order_time>'2020-8-5 00:00:00' BESTELLEN NACH d.order_time LIMIT 6; Wie im obigen Code gezeigt, ist es auch paginiert, aber es gibt eine maxId-Einschränkung. Was bedeutet das? maxId ist die maximale Primärschlüssel-ID auf der vorherigen Seite. Daher lautet die Voraussetzung für die Verwendung dieser Methode: 1) Der Primärschlüssel muss automatisch inkrementiert werden und darf keine UUID sein. Zusätzlich zur Übergabe der grundlegenden Paging-Parameter pageNo und pageSize muss das Front-End auch die maximale ID jeder vorherigen Seite bereitstellen. 2) Diese Methode unterstützt keine zufälligen Seitensprünge, d. h. sie kann nur nach oben und unten blättern. Die folgende Abbildung zeigt eine tatsächliche Seite eines bekannten E-Commerce-Unternehmens. Die zweite Möglichkeit ist die Suchmaschine Elastic Search (basierend auf invertiertem Index). Tatsächlich stellen E-Commerce-Unternehmen wie Taobao grundsätzlich alle ihre Produkte in die ES-Suchmaschine ein (es ist unmöglich, so große Datenmengen in MySQL einzugeben, und es ist nicht realistisch, sie in Redis einzugeben). Aber auch wenn Sie die Suchmaschine ES verwenden, können dennoch Deep-Paging-Probleme auftreten. Was sollten Sie dann tun? Die Antwort erfolgt über das Scrollen des Cursors. Wir werden hier nicht näher auf diesen Punkt eingehen, aber wer interessiert ist, kann selbst recherchieren. Zusammenfassung Ich habe diesen Blog geschrieben, weil ich es vor einiger Zeit während der Entwicklung tatsächlich erlebt habe und es während des Byte-Interviews mit dem Interviewer besprochen habe. Wenn Sie die Einschränkungen und Optimierungen von LIMIT kennen, ist das ein Plus, wenn Sie dies im Vorstellungsgespräch erwähnen können. Sagen Sie nicht, dass es bei der MySQL-Optimierung nur um das Erstellen von Indizes und Anpassen von SQL geht (tatsächlich sind die Auswirkungen dieser beiden Optimierungslösungen in der realen Entwicklung minimal). Wenn die MySQL-Optimierung so großartig wäre, gäbe es nicht so viele Middlewares. Oben finden Sie Einzelheiten dazu, wie Sie in MySQL schnell Millionen von Daten paginieren können. Weitere Informationen zum schnellen Paginieren in MySQL finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
<<: So installieren und konfigurieren Sie GitLab unter Ubuntu 20.04
>>: js, um eine einfache Lotteriefunktion zu erreichen
Wir alle kennen die Drag-and-Drop-Funktion von HT...
Wir verwenden normalerweise Float-Layout, um die ...
Best Practices für die Web-Frontend-Optimierung: ...
Beim Speichern von Daten in MySQL werden manchmal...
1. MySQL installieren # Laden Sie MySQL im Docker...
Kürzlich hat Microsoft Windows Server 2016 veröff...
1. Laden Sie nginx herunter [root@localhost my.Sh...
MySQL ist eine von mehreren Benutzern verwaltete ...
1. Integrierte Funktionen 1. Mathematische Funkti...
Inhalt dieses Artikels: Seitenhohlmaskenebene, Se...
Durch die Verwendung von Dockerfile können Benutz...
Als ich kürzlich kazam in Ubuntu 20.04 zur Aufzei...
In MySQL verwenden wir häufig order by zum Sortie...
Da ich selbst eine Webseite schreiben möchte, lern...
Inhaltsverzeichnis Vorwort Nr.1 Ein Fokus Nr. 2 E...