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

Eine kurze Analyse der Zählverfolgung einer Anfrage in nginx

Lassen Sie mich zunächst die Anwendungsmethode er...

Detaillierte Einführung in das benutzerdefinierte Docker-Netzwerk

Inhaltsverzeichnis Benutzerdefiniertes Docker-Net...

Beispiel für den Aufbau eines Redis-Sentinel-Clusters basierend auf Docker

1. Übersicht Redis Cluster ermöglicht hohe Verfüg...

So passen Sie mit CSS einen schöneren Link-Prompt-Effekt an

Vorschlag: Das möglichst häufige handschriftliche ...

Grafisches Tutorial zur Installation von MySQL 8.0.12

MySQL8.0.12-Installationstutorial, mit allen teil...

Eine kurze Analyse der asynchronen DOM-Aktualisierung von Vue

Inhaltsverzeichnis Das Prinzip der asynchronen DO...

Allgemeine Array-Operationen in JavaScript

Inhaltsverzeichnis 1. verketten() 2. beitreten() ...

Das kürzeste JS, um festzustellen, ob es sich um IE6 handelt (IE-Schreibmethode)

Häufig verwendeter JavaScript-Code zum Erkennen d...

Detaillierte Verwendung des Vue More Filter-Widgets

In diesem Artikelbeispiel wird die Implementierun...

Demo für 10-Farbverlaufshintergrund des CSS-Containers (linear-gradient())

Grammatik Hintergrund: linearer Farbverlauf (Rich...

Implementierung eines Puzzlespiels mit js

In diesem Artikel wird der spezifische Code von j...

Tiefgreifendes Verständnis der Rolle von Vuex

Inhaltsverzeichnis Überblick So teilen Sie Daten ...