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
mysql gibt den Booleschen Typ zurück Im ersten Fa...
1. Problem Manchmal, wenn wir uns bei Mysql anmel...
Das Seitenlayout war mir schon immer ein Anliegen...
Inhaltsverzeichnis Der erste Der Zweite Native Js...
Die Kapselung und Verwendung der Vue-Komponente z...
Die traditionelle Methode besteht darin, ein Quad...
Keepalive wird häufig zum Caching in Vue-Projekte...
Inhaltsverzeichnis 1. vorErstellen & erstellt...
Ich habe kürzlich einige CSS-bezogene Wissenspunk...
Die Funktion, die ich erreichen möchte, besteht d...
Inhaltsverzeichnis Vorwort Vorbereitung Gehen! Te...
Inhaltsverzeichnis Verzeichnisstruktur bin-Verzei...
Inhaltsverzeichnis Vorwort Ziel Erster Schritt: S...
Die Beschreibung von echo im Linux-Hilfedokument ...
Inhaltsverzeichnis 1. Szenenlayout 2. Fügen Sie e...