Indexe auf Lesereplikaten erstellen und verwalten

Auf dieser Seite wird beschrieben, wie Indexe auf Cloud SQL-Lesereplikaten hinzugefügt und gelöscht werden. Auch wenn ein Replikat normalerweise schreibgeschützt ist, möchten Sie in Tabellen zu Berichterstellungszwecken möglicherweise sekundäre Indexe erstellen. Cloud SQL bietet eine Reihe von gespeicherten Prozeduren zum Verwalten dieser Indexe.

Terminologie

  • Geclusterter Index: Der Hauptindex in einer MySQL-Tabelle, der die Zeilen auf dem Laufwerk physisch sortiert. Wenn Sie einen Primärschlüssel für eine Tabelle definieren, verwendet MySQL diesen als geclusterten Index. Pro Tabelle kann nur ein geclusterter Index vorhanden sein.
  • Sekundärer Index: Ein zusätzlicher Index für eine MySQL-Tabelle, der die Abfrageleistung optimiert.

Gespeicherte Prozeduren für Indexe

Cloud SQL enthält zwei gespeicherte Prozeduren im mysql-Schema, mit denen Sie sekundäre Indexe auf einem MySQL-Lesereplikat hinzufügen und löschen können. Beachten Sie, dass diese Prozeduren zwar auf einer primären Quellinstanz ausgeführt werden können, aber für Lesereplikate vorgesehen sind.

mysql.addSecondaryIdxOnReplica
Fügt Sie der Datenbank einen sekundären Index hinzu. Diese gespeicherte Prozedur ist ein Wrapper für die DDL-Anweisung CREATE INDEX.

Parameter:

  • idxType – Indextyp, der erstellt werden soll. Übergeben Sie beispielsweise UNIQUE, um einen eindeutigen Index zu erstellen.
  • idxName – Name des Index.
  • tableName: Name der Tabelle im Format „schema.name“.
  • idxDefinition – Definition des Index. Fügen Sie keine äußeren Klammern ein.
  • idxOption – Zusätzliche Optionen, die bei der Erstellung des Index übergeben werden sollen. In MySQL 8.0 könnte eine Option beispielsweise INVISIBLE für einen sichtbaren Index weitergeben.

Syntax:

mysql.addSecondaryIdxOnReplica(idxType, idxName, tableName, idxDefinition, idxOption)
     
mysql.dropSecondaryIdxOnReplica
Löscht einen sekundären Index für die Datenbank. Diese gespeicherte Prozedur ist ein Wrapper für die DDL-Anweisung DROP INDEX.

Parameter:

  • idxName – Name des Index.
  • tableName: Name der Tabelle im Format „schema.name“.
  • idxOption – Zusätzliche Optionen, die beim Löschen eines Index übergeben werden sollen. Ein Beispiel wäre eine Algorithmusoption wie INPLACE.

Syntax:

mysql.dropSecondaryIdxOnReplica(idxName, tableName, idxOption)
      

Informationen zu den Parametern idxType und idxOption finden Sie in der Dokumentation der Hauptversion von MySQL, die auf der Cloud SQL-Instanz ausgeführt wird.

Beispiele

Richtige Verwendung

Im Folgenden finden Sie einige Beispielaufrufe der Prozeduren. Angenommen, wir haben eine Tabelle mit der folgenden Definition.

CREATE TABLE sampletest.t1(
   id int(10) unsigned NOT NULL AUTO_INCREMENT,
   first_name varchar(64) NOT NULL,
   last_name varchar(64) NOT NULL,
   license_id int NOT NULL,
   PRIMARY KEY (id),
   KEY idx_fname (first_name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Wenn Sie einen regulären Index mit dem Namen t1_fname_lname für die Spalten first_name und last_name erstellen möchten, führen Sie Folgendes aus:

call mysql.addSecondaryIdxOnReplica('', 't1_fname_lname', 'sampletest.t1', 'first_name, last_name', '')

Wenn Sie auch einen eindeutigen Index mit dem Namen t1_license_id für die Spalte license_id mit dem Kommentar „unique license id“ erstellen möchten, führen Sie Folgendes aus:

call mysql.addSecondaryIdxOnReplica('unique', 't1_license_id', 'sampletest.t1', 'license_id', 'comment \"unique license id\"')

Wenn Sie dann den Index „t1_fname_lname“ löschen möchten, würden Sie Folgendes ausführen:

call mysql.dropSecondaryIdxOnReplica('t1_fname_lname', 'sampletest.t1', '')

Falsche Verwendung

Der folgende Versuch, einen Index für die Spalten first_name und last_name zu erstellen, schlägt aufgrund der äußeren Klammern im Parameter "idxDefinition" fehl.

call mysql.addSecondaryIdxOnReplica('', 't1_extra_parenthesis', 'sampletest.t1', '(first_name, last_name)', '')

Sie können Indexe nur für von Kunden erstellte Tabellen hinzufügen. Der folgende Versuch, einen Index in der Hostspalte der mysql.servers-Tabelle zu erstellen, schlägt fehl.

call mysql.addSecondaryIdxOnReplica('', 'idx_invalid', 'mysql.servers', 'host', '')

Sie können die Prozedur dropSecondaryIdxOnReplica nur verwenden, um Indexe zu löschen, die zuvor mit der Prozedur addSecondaryIdxOnReplica erstellt wurden. Der folgende Aufruf zum Löschen des vorhandenen Index idx_fname schlägt beispielsweise fehl.

call mysql.dropSecondaryIdxOnReplica('idx_fname', 'sampletest.t1', '')

Die SQL-Injection schlägt in diesen Prozeduraufrufen fehl. Die folgende SQL-Injection mit einer Kommentarsequenz schlägt beispielsweise fehl.

call mysql.addSecondaryIdxOnReplica(\"user 'a'@'%' --\", 'idx_fname', 'sampletest.t1', 'first_name', '')

Ebenso schlägt dieser SQL-Injection-Versuch mit einem Trennzeichen fehl.

call mysql.addSecondaryIdxOnReplica('', 'idx_fname', 'sampletest.t1', 'first_name', ';flush status')

Neuerstellung von Lesereplikaten

Bei einem Problem erstellt Cloud SQL gelegentlich ein Lesereplikat aus der primären Quelle, um die Instanz schnell wiederherzustellen. Indexe, die vor einem Neuerstellungsvorgang auf dem Lesereplikat erstellt wurden, werden nicht beibehalten. Die Kunden müssen diese Indexe mithilfe der gespeicherten Prozeduren auf dem Lesereplikat neu erstellen.

Nächste Schritte