Führt MySQL die Aktualisierungsanweisung erneut aus, wenn sie dieselben Daten enthält wie die ursprüngliche?

Führt MySQL die Aktualisierungsanweisung erneut aus, wenn sie dieselben Daten enthält wie die ursprüngliche?

Hintergrund

In diesem Artikel wird hauptsächlich getestet, ob die Update-Anweisung, die mit den Originaldaten identisch (d. h. unverändert) ist, in MySQL erneut ausgeführt wird, wenn MySQL die Update-Anweisung ausführt.

Testumgebung

  • MySQL 5.7.25
  • Centos 7.4

binlog_format ist ROW

Parameter

root@localhost: (keine) 04:53:15> Variablen wie „binlog_row_image“ anzeigen;
+------------------+--------+
| Variablenname | Wert |
+------------------+--------+
| binlog_row_image | VOLL |
+------------------+--------+
1 Zeile im Satz (0,00 Sek.)

root@localhost: (keine) 04:53:49> Variablen wie „binlog_format“ anzeigen; 
+---------------+-------+
| Variablenname | Wert |
+---------------+-------+
| binlog_format | REIHE |
+---------------+-------+
1 Zeile im Satz (0,00 Sek.)

root@localhost: Test 05:15:14> Variablen wie „transaction_isolation“ anzeigen;
+----------------------+-----------------+
| Variablenname | Wert |
+----------------------+-----------------+
| Transaktionsisolierung | WIEDERHOLBARES LESEN |
+----------------------+-----------------+
1 Zeile im Satz (0,00 Sek.)

Testschritte

Sitzung1

root@localhost: Test 04:49:48> Beginn;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

root@localhost: Test 04:49:52> Auswahl * aus Test, wobei ID = 1;
+----+------+------+------+
| ID | Seite | Mittel | Name |
+----+------+------+------+
| 1 | 999 | 871 | NW |
+----+------+------+------+
1 Zeile im Satz (0,00 Sek.)

root@localhost : (keine) 04:54:03> Engine-InnoDB-Status anzeigen\G Master-Status anzeigen\G
...
---
PROTOKOLL
---
Protokollsequenznummer 12090390
Protokoll gelöscht bis 12090390
Seiten bis 12090390 geleert
Letzter Kontrollpunkt bei 12090381
0 ausstehende Log-Leervorgänge, 0 ausstehende CHKP-Schreibvorgänge
33 Log-E/A's erledigt, 0,00 Log-E/A's/Sekunde

*************************** 1. Reihe ***************************
  Datei:mysql-bin.000001
  Position: 154
 Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Ausgeführtes_Gtid_Set: 
1 Zeile im Satz (0,00 Sek.)

Sitzung2

root@localhost: Test 04:47:45> Testsatz aktualisieren sid=55, wobei id =1;
Abfrage OK, 1 Zeile betroffen (0,01 Sek.)
Übereinstimmende Zeilen: 1 Geändert: 1 Warnungen: 0

root@localhost : (keine) 04:54:03> Engine-InnoDB-Status anzeigen\G Master-Status anzeigen\G
...
---
PROTOKOLL
---
Protokollsequenznummer 12091486
Protokoll gelöscht bis 12091486
Seiten bis 12091486 geleert
Letzter Kontrollpunkt bei 12091477
0 ausstehende Log-Leervorgänge, 0 ausstehende CHKP-Schreibvorgänge
39 Log-E/A's erledigt, 0,00 Log-E/A's/Sekunde

*************************** 1. Reihe ***************************
  Datei:mysql-bin.000001
  Position: 500
 Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Ausgeführtes_Gtid_Set: 8392d215-4928-11e9-a751-0242ac110002:1
1 Zeile im Satz (0,00 Sek.)

Sitzung1

root@localhost: Test 04:49:57> Testsatz aktualisieren sid=55, wobei id =1; 
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
Übereinstimmende Zeilen: 1 Geändert: 0 Warnungen: 0

root@localhost : (keine) 04:54:03> Engine-InnoDB-Status anzeigen\G Master-Status anzeigen\G
...
---
PROTOKOLL
---
Protokollsequenznummer 12091486
Protokoll gelöscht bis 12091486
Seiten bis 12091486 geleert
Letzter Kontrollpunkt bei 12091477
0 ausstehende Log-Leervorgänge, 0 ausstehende CHKP-Schreibvorgänge
39 Log-E/A's erledigt, 0,00 Log-E/A's/Sekunde

*************************** 1. Reihe ***************************
  Datei:mysql-bin.000001
  Position: 500
 Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Ausgeführtes_Gtid_Set: 8392d215-4928-11e9-a751-0242ac110002:1
1 Zeile im Satz (0,00 Sek.)

root@localhost: Test 04:52:05> Auswahl * aus Test, wobei ID = 1;
+----+------+------+------+
| ID | Seite | Mittel | Name |
+----+------+------+------+
| 1 | 999 | 871 | NW |
+----+------+------+------+
1 Zeile im Satz (0,00 Sek.)

root@localhost: Test 04:52:42> Commit;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

root@localhost: Test 04:52:52> Auswahl * aus Test, wobei ID = 1;
+----+------+------+------+
| ID | Seite | Mittel | Name |
+----+------+------+------+
| 1 | 55 | 871 | NW |
+----+------+------+------+
1 Zeile im Satz (0,00 Sek.)

Zusammenfassen

Wenn binlog_format=row und binlog_row_image=FULL , muss MySQL alle Felder im Binärprotokoll aufzeichnen, damit beim Lesen der Daten alle Daten gelesen werden und keine Aktualisierungen doppelter Daten ausgeführt werden. Das heißt, MySQL ruft die von der InnoDB-Engine bereitgestellte Schnittstelle "Ändern in (1,55)" auf, die Engine stellt jedoch fest, dass der Wert mit dem ursprünglichen Wert identisch ist, aktualisiert ihn nicht und gibt direkt zurück

binlog_format ist STATEMENT

Parameter

root@localhost: (keine) 04:53:15> Variablen wie „binlog_row_image“ anzeigen;
+------------------+--------+
| Variablenname | Wert |
+------------------+--------+
| binlog_row_image | VOLL |
+------------------+--------+
1 Zeile im Satz (0,00 Sek.)

root@localhost: (keine) 05:16:08> Variablen wie „binlog_format“ anzeigen;
+---------------+-----------+
| Variablenname | Wert |
+---------------+-----------+
| binlog_format | ANWEISUNG |
+---------------+-----------+
1 Zeile im Satz (0,00 Sek.)

root@localhost: Test 05:15:14> Variablen wie „transaction_isolation“ anzeigen;
+----------------------+-----------------+
| Variablenname | Wert |
+----------------------+-----------------+
| Transaktionsisolierung | WIEDERHOLBARES LESEN |
+----------------------+-----------------+
1 Zeile im Satz (0,00 Sek.)

Testschritte

Sitzung1

root@localhost: Test 05:16:42> Beginn;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

root@localhost: Test 05:16:44> Auswahl * aus Test, wobei ID = 1;
+----+------+------+------+
| ID | Seite | Mittel | Name |
+----+------+------+------+
| 1 | 111 | 871 | NW |
+----+------+------+------+
1 Zeile im Satz (0,00 Sek.)

root@localhost : (keine) 05:16:51> Engine-InnoDB-Status anzeigen\G Master-Status anzeigen\G
...
---
PROTOKOLL
---
Protokollsequenznummer 12092582
Protokoll gelöscht bis 12092582
Seiten bis 12092582 geleert
Letzter Kontrollpunkt bei 12092573
0 ausstehende Log-Leervorgänge, 0 ausstehende CHKP-Schreibvorgänge
45 Log-E/A's erledigt, 0,00 Log-E/A's/Sekunde

*************************** 1. Reihe ***************************
    Datei:mysql-bin.000001
   Position: 154
  Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Ausgeführtes_Gtid_Set: 
1 Zeile im Satz (0,00 Sek.)

Sitzung2

root@localhost: Test 05:18:30> Testsatz aktualisieren sid=999, wobei id =1;
Abfrage OK, 1 Zeile betroffen (0,00 Sek.)
Übereinstimmende Zeilen: 1 Geändert: 1 Warnungen: 0

root@localhost : (keine) 05:18:47> Engine-InnoDB-Status anzeigen\G Master-Status anzeigen\G
...
---
PROTOKOLL
---
Protokollsequenznummer 12093678
Protokoll gelöscht bis 12093678
Seiten bis 12093678 geleert
Letzter Kontrollpunkt bei 12093669
0 ausstehende Log-Leervorgänge, 0 ausstehende CHKP-Schreibvorgänge
51 Log-E/A's erledigt, 0,14 Log-E/A's/Sekunde

*************************** 1. Reihe ***************************
    Datei:mysql-bin.000001
   Position: 438
  Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Ausgeführtes_Gtid_Set: 8392d215-4928-11e9-a751-0242ac110002:1
1 Zeile im Satz (0,00 Sek.)

Sitzung1

root@localhost: Test 05:16:47> Testsatz aktualisieren sid=999, wobei id =1;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
Übereinstimmende Zeilen: 1 Geändert: 0 Warnungen: 0

root@localhost : (keine) 05:20:03> Engine-InnoDB-Status anzeigen\G Master-Status anzeigen\G
...
---
PROTOKOLL
---
Protokollsequenznummer 12094504
Protokoll gelöscht bis 12094504
Seiten bis 12094504 geleert
Letzter Kontrollpunkt bei 12094495
0 ausstehende Log-Leervorgänge, 0 ausstehende CHKP-Schreibvorgänge
56 Log-E/A's erledigt, 0,00 Log-E/A's/Sekunde

*************************** 1. Reihe ***************************
    Datei:mysql-bin.000001
   Position: 438
  Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Ausgeführtes_Gtid_Set: 8392d215-4928-11e9-a751-0242ac110002:1
1 Zeile im Satz (0,00 Sek.)

root@localhost: Test 05:19:33> Auswahl * aus Test, wobei ID = 1;  
+----+------+------+------+
| ID | Seite | Mittel | Name |
+----+------+------+------+
| 1 | 999 | 871 | NW |
+----+------+------+------+
1 Zeile im Satz (0,00 Sek.)

root@localhost: Test 05:20:44> Commit;
Abfrage OK, 0 Zeilen betroffen (0,01 Sek.)

root@localhost: Test 05:20:57> Auswahl * aus Test, wobei ID = 1;
+----+------+------+------+
| ID | Seite | Mittel | Name |
+----+------+------+------+
| 1 | 999 | 871 | NW |
+----+------+------+------+
1 Zeile im Satz (0,00 Sek.)

Zusammenfassen

Wenn binlog_format=statement und binlog_row_image=FULL ist, führt InnoDB die Aktualisierungsanweisung sorgfältig aus, d. h. die Operation „Ändern Sie diesen Wert auf (1.999)“, sperrt, was gesperrt werden muss, und aktualisiert, was aktualisiert werden muss.

Das ist alles für diesen Artikel. Ich hoffe, dass der Inhalt dieses Artikels für Ihr Studium oder Ihre Arbeit von gewissem Referenzwert ist. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

Das könnte Sie auch interessieren:
  • So ermitteln Sie die Abfragezeit einer MySQL-SQL-Anweisung in PHP
  • Wie wird eine SQL-Anweisung in MySQL ausgeführt?

<<:  Vue realisiert Web-Online-Chat-Funktion

>>:  So legen Sie die Umgebungsvariable PATH im Linux-System fest (3 Methoden)

Artikel empfehlen

Informationen zu UDP in Linux

Inhaltsverzeichnis 1. Einführung in UDP und Linux...

So legen Sie die Tabellenbreite in IE8 und Chrome fest

Wenn die oben genannten Einstellungen in IE8 und C...

NodeJS realisiert die Bildtextsegmentierung

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

Mysql löst das N+1-Abfrageproblem der Datenbank

Einführung In Orm-Frameworks wie Hibernate und My...

Anbieterpräfix: Warum brauchen wir ein Browser-Engine-Präfix?

Was ist das Lieferantenpräfix? Anbieterpräfix – B...

So aktivieren Sie Fernzugriffsberechtigungen in MySQL

1. Melden Sie sich bei der MySQL-Datenbank an mys...

Detaillierte Erklärung der wechselseitigen Verwendung von Ref in React

Inhaltsverzeichnis 1. Lassen Sie uns zunächst erk...

Detaillierte Erklärung zum effizienten MySQL-Paging

Vorwort Normalerweise wird für MySQL-Abfragen mit...

Ein Beispiel, wie JavaScript doppelte Netzwerkanforderungen verhindern kann

Vorwort Während der Entwicklung stoßen wir häufig...

Detaillierte Erklärung der MySQL information_schema-Datenbank

1. Übersicht Die Datenbank information_schema ist...