Heim  >  Artikel  >  Datenbank  >  So beheben Sie Produktionsfehler, die durch MySQL-Update-SQL verursacht werden

So beheben Sie Produktionsfehler, die durch MySQL-Update-SQL verursacht werden

WBOY
WBOYnach vorne
2023-05-31 13:31:141063Durchsuche

Fehlermanifestation

  • Einerseits: Auf der Clusterverwaltungsseite, die der Cloud-Datenbank PolarDB in der Alibaba Cloud-Konsole entspricht, wurde in der Ein-Klick-Diagnosesitzungsverwaltung im Diagnose- und Optimierungsmodul Folgendes festgestellt Die Ausführung eines bestimmten SQL-Updates dauerte sehr lange stieg weiter an und einige Vorgänge wirkten sich negativ auf die Nutzung durch die Kunden aus.

  • GeschäftshintergrundDa der Geschäftsablauf im Geschäftsbetrieb relativ komplex ist und der Austausch reiner Technologie nicht im Mittelpunkt der Diskussion steht, werden Analogien verwendet, um die Gründe für das Auftreten des Problems besser zu verstehen Wird zum Teilen des Komplexes verwendet. Die Geschäftsanalogie lautet wie folgt: Es gibt drei Tabellen in der Datenbank, die erste Tabelle ist

    t_grandfather
  • (Großvatertabelle), die zweite Tabelle ist
t_father

(übergeordnete Tabelle) und die dritte Tabelle ist

t_grandson

(Nachkommentabelle), DDL Wie folgt:

CREATE TABLE `t_grandfather ` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `count` int(11) NOT NULL DEFAULT 0 COMMENT '子孙后代数量',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='老爷表';

CREATE TABLE `t_father ` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `grandfather_id` int(11) NOT NULL COMMENT '老爷表id',
  PRIMARY KEY (`id`),
  KEY `idx_grandfather_id` (`grandfather_id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='老爸表';

CREATE TABLE `t_grandson` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `grandfather_id` int(11) NOT NULL COMMENT '老爷表id',
  PRIMARY KEY (`id`),
  KEY `idx_grandfather_id` (`grandfather_id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='孙子表';
Die Geschäftslogikbeziehung zwischen den drei Tabellen besteht darin, dass zuerst die Mastertabelle generiert wird und der Master dann viele Frauen (Geschäft) nimmt und weiterhin Babys bekommt Wenn das Baby geboren wird, wird gleichzeitig eine Papa-Tabelle erstellt. Die Anzahl = Anzahl + 1 der Master-Tabelle wird aktualisiert, um anzuzeigen, dass ein neuer Nachwuchs hinzugefügt wurde. Die zuvor geborenen Babys werden auch Frauen haben, und ihre Frauen werden auch Babys haben. Für den Meister bedeutet dies, dass er einen Enkel hat (was neue Geschäftsdaten generiert). Nachdem er einen Enkel bekommen hat, muss er auch die Anzahl aktualisieren +1 der Master-Tabelle, was bedeutet, dass ein neuer Nachkomme hinzugefügt wurde usw. Es gibt keine Nachkommen (Geschäftsdaten werden kontinuierlich generiert). Wie in der folgenden Abbildung gezeigt: Die Logik von

ancestral Der Code lautet: Solange es neue Ergänzungen zur Tabelle

t_father

und

t_grandsonSo beheben Sie Produktionsfehler, die durch MySQL-Update-SQL verursacht werden gibt, aktualisieren Sie

t_grandfather

. Dieses logische Design stellt kein großes Problem dar, aber angesichts der großen Datenmenge in der Enkeltabelle wird hier ein sehr ernstes Leistungsproblem auftreten. Das Folgende ist ein Teil des aus dem Unternehmen extrahierten Pseudocodes:

 /**
 * 处理 father 的业务
 */
 public void doFatherBusiness  (){
     //do fatherBusiness baba .... 此处省
     // 插入 t_father 表
    if (fatherMapper.inster(father)){
         //update t_grandfather set count=count+1 where id= #{grandfatherId}
         grandfatherMapper.updateCount(father.getGrandfatherId  ())  ;
     }
}


 /**
 * 处理 grandson 的业务
 */
 public void doGrandsonBusiness  (){
     //do grandson baba .... 此处省略
     // 插入 t_grandson 表
     if(grandsonMapper.inster(grandson)){
          //update t_grandfather set count=count+1 where id= #{grandfatherId}
          grandfatherMapper.updateCount(grandson.getGrandfatherId());
     }
}
Wenn mehrere Unternehmen (Threads) jeweils die obige Methode aufrufen, führt dies zu einem enormen Druck auf den Aktualisierungsvorgang der Tabelle t_grandfather, insbesondere wenn dieselbe ID aktualisiert wird . Der Wettbewerb um Sperren innerhalb des MySQL-Servers ist sehr groß. Die endgültige Leistung stimmt mit der obigen Hintergrundbeschreibung überein. Lösung

1. Vorübergehende Lösung:

Begrenzen Sie einerseits den SQL-Fluss und erzwingen Sie das Beenden der normalerweise blockierten Sitzung, damit der Datenthread nicht blockiert und freigegeben wird. Reduzieren Sie andererseits die Anzahl der Knoten für den Dienst, der Anfragen empfängt, um die Menge der eingegebenen Geschäftsdaten zu reduzieren.

2 Langfristige Lösung: Ändern Sie einerseits das oben genannte Geschäft Logik und Einfügen der Tabellen t_grandson und t_father, Aktualisieren des Zählfelds der Tabelle t_grandfather, andererseits werden alle auf andere Methoden umgestellt;

Das obige ist der detaillierte Inhalt vonSo beheben Sie Produktionsfehler, die durch MySQL-Update-SQL verursacht werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen