In letzter Zeit gibt es eine besonders ungewöhnliche Geschäftsnachfrage, es gibt einen Tisch CREATE TABLE `demo` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `tid` int(11) STANDARD '0', `pid` int(11) STANDARD '1', PRIMÄRSCHLÜSSEL (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3000124 DEFAULT CHARSET=utf8; Das ist alles. Es gibt mehr als 3 Millionen Zeilen mit Datensätzen. Jede PID zeichnet die Kategorie der obersten Ebene dieser ID auf, und die TID ist ihre übergeordnete Kategorie! Es gibt in Oracle eine Methode namens connect_by_isleaf, mit der alle Teilmengen problemlos gefunden werden können, aber ich verwende MySQL ... Daher werde ich hier einfach über meine Erfahrungen mit der Verwendung von MySQL-Methoden oder gespeicherten Prozeduren zur Implementierung schreiben Erstens: MySQL-Methode CREATE DEFINER=`root`@`localhost` FUNCTION `lvtao_demo_a`(rootId int) GIBT Text CHARSET utf8 ZURÜCK Liest SQL-Daten KOMMENTAR 'Demo' BEGINNEN DECLARE sTemp-Text; DECLARE sTempChd-Text; SET sTempChd =cast(rootId als CHAR); SETZEN Sie sTemp = ''; WHILE sTempChd ist nicht null DO SET sTemp = concat(sTemp,',',sTempChd); Wählen Sie group_concat(id) INTO sTempChd FROM demo, wobei FIND_IN_SET(tid, sTempChd)>0; ENDE WÄHREND; RÜCKGABE sTemp; ENDE; Die Verwendungsmethode ist wähle lvtao_demo_a(5); Aber als ich es getestet habe, sind die 3 Millionen Daten praktisch abgestürzt! ! ! Daten zu lang für Spalte „sTemp“ in Zeile 1 Vorteile: einfach, bequem, keine Begrenzung der Tiefe der rekursiven Aufrufebenen (max_sp_recursion_depth, maximal 255); Der zweite Typ: gespeicherte Prozedur + Zwischentabelle TRENNUNGSZEICHEN ;; CREATE DEFINER=`root`@`localhost` VERFAHREN `sss`(IN pid int, IN rootid int) BEGINNEN DECLARE fertig INT DEFAULT FALSE; ID-TEXT DEKLARIEREN; DECLARE cur1 CURSOR FÜR SELECT id FROM demo WHERE tid=pid; DECLARE CONTINUE HANDLER FÜR NICHT GEFUNDEN SET done = TRUE; setze max_sp_recursion_depth = 200; ÖFFNEN cur1; read_loop: SCHLEIFE Hole cur1 in ID; WENN erledigt, DANN LEAVE read_loop; ENDE, WENN; INSERT INTO temp(rootid,zid) Werte(rootid,id); rufe sss(id,rootid) auf; ENDE DER SCHLEIFE; SCHLIESSEN cur1; ENDE;; TRENNUNGSZEICHEN ; Haha, 3 Millionen Daten stecken auch in einem Ball~~~ Lass uns einen anderen Weg finden~~~~ Ich werde mich damit nicht mehr beschäftigen Das könnte Sie auch interessieren:
|
<<: Zusammenfassung der Verwendung von berechneten Vue-Eigenschaften und -Listenern
>>: So stellen Sie ElasticSearch in Docker bereit
Lassen Sie mich zunächst die Anwendungsmethode er...
Inhaltsverzeichnis Benutzerdefiniertes Docker-Net...
1. Übersicht Redis Cluster ermöglicht hohe Verfüg...
Vorschlag: Das möglichst häufige handschriftliche ...
MySQL8.0.12-Installationstutorial, mit allen teil...
Inhaltsverzeichnis Das Prinzip der asynchronen DO...
Inhaltsverzeichnis 1. verketten() 2. beitreten() ...
Häufig verwendeter JavaScript-Code zum Erkennen d...
In diesem Artikelbeispiel wird die Implementierun...
Grammatik Hintergrund: linearer Farbverlauf (Rich...
Da das, was ich zuvor geschrieben habe, nicht det...
1. Umweltvorbereitung CentOS Linux Version 7.5.18...
In diesem Artikel wird der spezifische Code von j...
Vorwort In diesem Artikel sind einige allgemeine ...
Inhaltsverzeichnis Überblick So teilen Sie Daten ...