VorwortUm 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. FallHier 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. Hier sehen wir uns den Ausführungsplan an, wie unten dargestellt:
Wenn man das Bild oben betrachtet, sieht man, dass dieselbe Anweisung allein aufgrund der unterschiedlichen Offsets (erlauben Sie mir, ein wenig zu übertreiben) sehr unterschiedliche Ausführungspläne hat. In der ersten Anweisung, 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 besteht in der Suchmaschinenoptimierung durch 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. Dies ist das Ende dieses Artikels über MySQL Deep Paging (wie man schnell Millionen von Daten paginiert). Weitere Informationen zu MySQL Deep Paging finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! Das könnte Sie auch interessieren:
|
<<: Verkürzen Sie die Seiten-Rendering-Zeit, damit die Seite schneller läuft
Das Popup hat nichts damit zu tun, ob Ihr aktuelle...
Centos7 verwendet Yum, um MySQL zu installieren u...
1. Allgemeine MySQL-Konfiguration Alle folgenden ...
Vorwort: Für die Implementierung digitaler Additi...
Inhaltsverzeichnis Problembeschreibung Lösung Pro...
Erstellen eines Containers [root@server1 ~]# dock...
verwenden <div id="app"> <rout...
Exportstandard ({ URL (URL = URL = URL), Methode ...
Bei unserer täglichen Arbeit führen wir manchmal ...
In diesem Artikelbeispiel wird der spezifische Co...
Für das, was ich heute schreiben werde, lief das ...
Inhaltsverzeichnis 1. Konventionelle Ideen zur Ze...
Anpassen von Bildern mit Dockerfile Unter Bildanp...
1. Installationsanweisungen Im Vergleich zur loka...
Hintergrundbeschreibung: Auf einem vorhandenen La...