Wenn wir normalerweise MySQL-Sperren verwenden, berücksichtigen wir selten die Effizienz von Sperren, wenn wir mit Datenbanken noch nicht vertraut sind. Im Allgemeinen möchten wir nur den Zweck erreichen, Parallelität zu verhindern. Mit zunehmender Datenmenge werden wir jedoch feststellen, dass dies der Fall ist Es gibt viele. Wir haben SQL geschrieben, das sehr optimiert ist, aber manchmal ist es immer noch sehr langsam und es ist schwierig, den Grund zu finden. Zu diesem Zeitpunkt sollten wir überlegen, ob es durch die Sperre von MySQL verursacht wird.
Wir erstellen zunächst eine neue Datentabelle:
Hier ist unser Primärschlüssel standardmäßig indiziert; Fügen Sie hier ein paar Daten hinzu
Dann öffnen wir zwei Prozesse zum Testen:
Fügen Sie zunächst eine Where-Bedingung hinzu, die keine Indexsperre beinhaltet:
Dann aktualisieren wir die Daten dieser Zeile im zweiten Fenster, wir werden es finden dass dieser Vorgang hängen bleibt,
Wenn wir dann die Transaktion einreichen, finden wir die Daten von das zweite Fenster Es wird sofort ausgeführt.
Aus dem oben Gesagten scheint es kein Problem zu geben. Dies erreicht zwar den von uns gewünschten Zweck, Sie können jedoch die gleiche Sperre hinzufügen und versuchen, andere Daten zu aktualisieren, z Was ich unten ausgeführt habe Daten:
Ich habe die oben genannten drei Situationen mit demselben Prozess getestet. Sie werden alle stecken bleiben, daher tritt das Problem auf. Wir sperren tatsächlich name='test name' Wir möchten die beiden Zeilen id=133 und 134 sperren, aber wir können nicht auf diese drei Zeilen zugreifen, da es sich bei unserer Sperre um eine Tabellensperre handelt Verwenden des Index:
Der Index wird verwendet, wenn die obige Sperre verwendet wird, aber wir stecken immer noch beim Aktualisieren der Daten fest. Wir werden das Gefühl haben, dass der Index tatsächlich auch vorhanden ist nutzlos, aber wenn Sie auf dieselbe Sperre stoßen und beim Aktualisieren der Daten den Index verwenden, können Sie den Effekt sehen:
Wir werden feststellen, dass dies nicht gesperrt ist . Live, direkt aktualisiert;
Das Folgende ist eine Zusammenfassung: Wenn unsere Sperre einen Index verwendet, handelt es sich um eine Zeilensperre. Wenn sie keinen Index verwendet, handelt es sich um eine Tabellensperre Die von uns verwalteten Daten müssen eine Sperre verwenden Index, wir verwenden ihn beim Auswählen oder Positionieren von Daten. Er wird in Form eines vollständigen Tabellenscans ausgeführt, der eine Tabellensperre bildet. Wenn ein Index vorhanden ist, wird die angegebene Zeile direkt lokalisiert Beachten Sie jedoch, dass beim Aktualisieren der Daten die gesamte Tabelle gesperrt wird, wenn die gesperrte Zeile gescannt wird, sodass der gewünschte Effekt nicht erzielt werden kann erreicht werden;
Verwandte Empfehlungen:
MySQL-Sperrmechanismus_MySQLMySQL-Sperrverwendungssperre auf Tabellenebene
So optimieren Sie die MySQL-Sperre
Das obige ist der detaillierte Inhalt vonDie Verbindung zwischen MySQL-Sperren und Indizes. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!