Heim > Datenbank > MySQL-Tutorial > Was ist der Unterschied zwischen langsamem Commit in MySQL, langsamer Abfrage und langsamer Transaktion in Binlog?

Was ist der Unterschied zwischen langsamem Commit in MySQL, langsamer Abfrage und langsamer Transaktion in Binlog?

王林
Freigeben: 2023-05-30 08:07:10
nach vorne
1597 Leute haben es durchsucht

1. Ursache des Problems

Bei der Analyse von Leistungsproblemen werden häufig langsame Abfragen und langsame Binlog-Transaktionen verwendet. Kürzlich habe ich eine langsame Abfrage analysiert und festgestellt, dass sie eine große Anzahl langsamer Commit-Anweisungen enthielt, der Abgleich bei der Analyse der langsamen Binlog-Transaktionen jedoch nicht abgeschlossen werden konnte. Beispielsweise kann es in diesem Zeitraum 1.000 Commit-Anweisungen geben, aber möglicherweise nur 100 langsame Transaktionen. Das ist ein zu großer Unterschied. Warum tritt dieses Phänomen auf?

2. Entsprechende Beurteilungsmethoden

  • Langsame Transaktion Für eine Transaktion, die eine Übermittlung (Einfügung) anzeigt, ist sie normalerweise wie folgt:

  • GTID_LOG_EVENT und

  • Das erste Mal, dass der Befehl „INSERT“ initiiert wird, ist QUERY_EVENT.

  • MAP_EVENT/WRITE_ROWS_EVENT ist der Zeitpunkt, zu dem jeder „Einfüge“-Befehl initiiert wird.

Daher erhalten wir normalerweise eine langsame Transaktionszeit, indem wir die Zeit von QUERY_EVENT von der Zeit von Die Anweisung wird eingeleitet.

    Möglichkeit eines langsamen Commits
  • Wir wissen, dass der wahrscheinlichste Ort für ein langsames Commit das Leeren des Binlogs oder das Warten auf halbsynchronisierte Slave-ACK ist, aber die Zeit des XID-EREIGNISSES im Binlog umfasst diesen Teil nicht Zeit, das heißt Es wird gesagt, dass die Commit-Datensätze im Binlog langsame Transaktionen und langsame Abfragen nicht im gleichen Zeitraum aufzeichnen.

    Kurze Erklärung
  • Wenn wir die folgende Transaktion als Beispiel nehmen, eine kurze Erklärung
begin;
insert into it values(10);
commit;        
-- insert语句执行      -> QUERY_EVENT时间(T1)  
-- insert语句执行完成,判定insert语句是否为慢查询(T2)          
-- commit语句执行      -> GTID_LOG_EVENT和XID_EVENT时间(T3)
   flush
   fsync
                  -----> 传输binlog (sync_binlog=1)
                  <----   等待ACK   (rpl_semi_sync_master_wait_point=AFTER_SYNC)
   commit
-- commit语句执行完成,判定commit语句是否为慢查询(T4)
Nach dem Login kopieren

    Das Kriterium zur Beurteilung, ob die Einfügeanweisung langsam ist, ist T2-T1 (-Sperrzeit)
  • Um zu beurteilen, ob die Commit-Anweisung langsam ist. Der Standard für die Langsamkeit ist T4-T3.
  • Der Standard für die Beurteilung langsamer Transaktionen ist T3-T1 Beurteilung des langsamen Commits bei langsamen Abfragen, daher ist diese Situation normal, was im Folgenden bewiesen wird.
  • 3. Beweis

Hauptdatenbank: Das Halbsynchronisations-Timeout beträgt 999999999.

    Slave-Bibliothek: Setzen Sie sync_relay_log=1 und legen Sie den Haltepunkt für die Funktion MYSQL_BIN_LOG::flush_and_sync fest. Diese Funktion ist eine Beurteilungsfunktion, die auf der Festplatte platziert werden muss, nachdem jedes Ereignis von sync_relay_log=1 in das Relay-Protokoll geschrieben wurde . .
  • Auf diese Weise verlängert das künstliche Warten am Haltepunkt die Festschreibungszeit erheblich. Dies beweist auch, dass sich die langsame Halbsynchronisation wie folgt auf das langsame Festschreiben auswirkt:
  • begin;
    select now();   -T1
    insert into it values(10);
    select sleep(10);
    select now();   -T2
    commit; (断点在从库生效卡主ack) -T3
    select now();   -T4
    
    结果
    mysql> begin;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select now();      -T1
    +---------------------+
    | now()               |
    +---------------------+
    | 2022-06-12 22:20:43 |
    +---------------------+
    1 row in set (0.00 sec)
    
    mysql> insert into it values(10);
    Query OK, 1 row affected (0.10 sec)
    
    mysql> select sleep(10);
    
    +-----------+
    | sleep(10) |
    +-----------+
    |         0 |
    +-----------+
    1 row in set (10.01 sec)
    
    mysql> select now();      -T2 AND T3
    +---------------------+
    | now()               |
    +---------------------+
    | 2022-06-12 22:20:54 |
    +---------------------+
    1 row in set (0.00 sec)
    
    mysql> commit;         
    Query OK, 0 rows affected (21.64 sec)
    
    mysql> select now();    -T4
    +---------------------+
    | now()               |
    +---------------------+
    | 2022-06-12 22:21:15 |
    +---------------------+
    1 row in set (0.00 sec)
    Nach dem Login kopieren

    Lassen Sie uns die langsame Abfrage und das Binlog analysieren Fügen Sie es hier hinzu. Sleep(10) verlängert die Transaktionszeit, da die Einfügung zu schnell erfolgt.

binlog langsame Transaktion 22:20:54(T2) - 22:20:43(T1) = etwa 11 Sekunden (wir haben Sleep(10) hinzugefügt)

# at 12221
#220612 22:20:54 server id 613306  end_log_pos 12286 CRC32 0x3e019332   GTID    last_committed=40       sequence_number=41      rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= &#39;00320cc8-39f9-11ec-b5ba-000c2929706d:41&#39;/*!*/;
# at 12286
#220612 22:20:43 server id 613306  end_log_pos 12360 CRC32 0x8dcde193   Query   thread_id=43    exec_time=1     error_code=0
SET TIMESTAMP=1655043643/*!*/;
BEGIN
/*!*/;
# at 12360
#220612 22:20:43 server id 613306  end_log_pos 12409 CRC32 0x0db68582   Rows_query
# insert into it values(10)
# at 12409
#220612 22:20:43 server id 613306  end_log_pos 12456 CRC32 0x363a48c7   Table_map: `mysemi`.`it` mapped to number 124
# at 12456
#220612 22:20:43 server id 613306  end_log_pos 12496 CRC32 0xd44e43f3   Write_rows: table id 124 flags: STMT_END_F
### INSERT INTO `mysemi`.`it`
### SET
###   @1=10 /* INT meta=0 nullable=1 is_null=0 */
# at 12496
#220612 22:20:54 server id 613306  end_log_pos 12527 CRC32 0x4d8d2c64   Xid = 547
COMMIT/*!*/;
Nach dem Login kopieren
  • Commit in langsamer Abfrage ist langsam 22 :21:15(T4) - 22:20:54(T3) = 21 Sekunden

# Time: 2022-06-12T22:21:15.746223Z
# User@Host: root[root] @ localhost []  Id:    43
# Schema: mysemi  Last_errno: 0  Killed: 0
# Query_time: 21.641090  Lock_time: 0.000000  Rows_sent: 0  Rows_examined: 0  Rows_affected: 0
# Bytes_sent: 11
SET timestamp=1655043675;
commit;
Nach dem Login kopieren
    Hier ist offensichtlich, dass die Commit-Langsamkeit des langsamen Abfragedatensatzes offensichtlich nicht in der langsamen Transaktion enthalten ist.

Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen langsamem Commit in MySQL, langsamer Abfrage und langsamer Transaktion in Binlog?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage