MySQL implementiert eine Funktion ähnlich der MySQL-Methode oder gespeicherten Prozedur connect_by_isleaf

MySQL implementiert eine Funktion ähnlich der MySQL-Methode oder gespeicherten Prozedur connect_by_isleaf

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!
Jetzt lautet die Anforderung: Finden Sie durch Angabe einer ID alle ihre Teilmengenmitglieder heraus und ändern Sie den Wert dieser PID auf den neu angegebenen Wert! !
Ich habe es in PHP ausgeführt und die Ausführung hat über 50 Sekunden gedauert, was echt nervig war! ! !
Es ist notwendig, alle Teilmengen rekursiv zu finden und ihre PIDs zu ändern, was viel Arbeit bedeutet.

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);
Nachteile: Begrenzte Länge.

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:
  • So generieren Sie Datensätze stapelweise mithilfe gespeicherter Prozeduren in MySQL unter Linux
  • Einfache Implementierung von Mybatis, das eine gespeicherte MySQL-Prozedur aufruft
  • Vergleich der Unterschiede zwischen MySQL und Oracle: Fünf: Gespeicherte Prozeduren und Funktionen
  • Die gespeicherte MySQL-Prozedur ermittelt doppelte Daten und fügt sie nicht ein
  • Detaillierte Erklärung zum Aufrufen gespeicherter MySQL-Prozeduren in Java
  • Implementierung der Baumdurchquerung durch gespeicherte Prozeduren in der MySQL-Datenbank
  • Beispiel für die Optimierung gespeicherter MySQL-Prozeduren
  • Beispielanalyse gespeicherter Prozeduren in MySQL und wie gespeicherte Prozeduren aufgerufen werden
  • Detaillierte Erläuterung der gespeicherten Prozeduren, Cursor und Transaktionsbeispiele von MySQL

<<:  Zusammenfassung der Verwendung von berechneten Vue-Eigenschaften und -Listenern

>>:  So stellen Sie ElasticSearch in Docker bereit

Artikel empfehlen

Ein zeitaufwändiger Fehlerbehebungsprozess für einen Docker-Fehler

Inhaltsverzeichnis Herkunft Umweltinformationen F...

Analyse des MySQL-Client-Installationsprozesses auf dem Mac

Versuchen Sie die Installation über Pip in einer ...

JS erzielt Fünf-Sterne-Lobeffekt

Verwenden Sie JS, um objektorientierte Methoden z...

MySQL-Optimierung: Join statt Unterabfrage verwenden

Verwenden Sie JOIN anstelle von Unterabfragen MyS...

Erfahren Sie mehr über das V-Modell und seine Modifikatoren in einem Artikel

Inhaltsverzeichnis Vorwort Modifikatoren des V-Mo...

JavaScript zum Erzielen eines einfachen Karusselleffekts

Was ist ein Karussell? Karussell: In einem Modul ...

Implementierung der Bereitstellung eines privaten Docker-Warehouse-Registrars

Da immer mehr Docker-Images verwendet werden, mus...

Tipps zur Verwendung von Frameset zum Zentrieren des Breitbilds

Code kopieren Der Code lautet wie folgt: <fram...

Detaillierte Ansicht versteckter Spalten in MySQL

Inhaltsverzeichnis 1. Primärschlüssel vorhanden 2...

Warum MySQL-Datenbanken NULL so weit wie möglich vermeiden

Viele Tabellen in MySQL enthalten Spalten, die NU...