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
Inhaltsverzeichnis Herkunft Umweltinformationen F...
Versuchen Sie die Installation über Pip in einer ...
Verwenden Sie JS, um objektorientierte Methoden z...
Verwenden Sie JOIN anstelle von Unterabfragen MyS...
Inhaltsverzeichnis Vorwort Modifikatoren des V-Mo...
Was ist ein Karussell? Karussell: In einem Modul ...
Da immer mehr Docker-Images verwendet werden, mus...
(Wenn eine Webseite geladen wird, gibt es manchma...
Inhaltsverzeichnis Vue2.x-Nutzung Globale Registr...
Code kopieren Der Code lautet wie folgt: <fram...
Inhaltsverzeichnis 1. Primärschlüssel vorhanden 2...
Viele Tabellen in MySQL enthalten Spalten, die NU...
In diesem Artikel wird die Installations- und Kon...
Füge im CSS-Style des Elements, welches die Hinte...
Inhaltsverzeichnis 1. Art von 2. Instanz von 3. U...