Creazione e gestione degli indici sulle repliche di lettura

Questa pagina descrive come aggiungere e rimuovere gli indici nelle repliche di lettura Cloud SQL. Sebbene una replica sia normalmente di sola lettura, in alcuni casi potrebbe essere necessario creare indici secondari nelle tabelle a fini di generazione di report. Cloud SQL offre una serie di procedure archiviate per la gestione di questi indici.

Terminologia

  • Indice in cluster. L'indice principale su una tabella MySQL che ordina fisicamente le righe su disco. Quando definisci una chiave primaria in una tabella, MySQL la utilizza come indice in cluster. Può esserci un solo indice in cluster su una tabella.
  • Indice secondario. Un indice aggiuntivo su una tabella MySQL che ottimizza le prestazioni delle query.

Stored procedure per gli indici

Cloud SQL include due stored procedure nello schema mysql che puoi utilizzare per aggiungere e rilasciare indici secondari su una replica di lettura MySQL. Tieni presente che queste procedure possono essere eseguite su un'istanza di origine principale, ma sono progettate per le repliche di lettura.

mysql.addSecondaryIdxOnReplica
Aggiunge un indice secondario al database. Questa stored procedure è un wrapper per l'istruzione DDL CREATE INDEX.

Parametri:

  • idxType: il tipo di indice da creare. Ad esempio, passa UNIQUE per creare un indice univoco.
  • idxName: il nome dell'indice.
  • tableName: il nome della tabella nel formato schema.name.
  • idxDefinition: la definizione dell'indice. Non includere le parentesi esterne.
  • idxOption: eventuali opzioni aggiuntive per ignorare la creazione dell'indice. Ad esempio, in MySQL 8.0, un'opzione potrebbe passare INVISIBLE per un indice invisibile.

Sintassi:

mysql.addSecondaryIdxOnReplica(idxType, idxName, tableName, idxDefinition, idxOption)
     
mysql.dropSecondaryIdxOnReplica
Elimina un indice secondario sul database. Questa stored procedure è un wrapper per l'istruzione DDL DROP INDEX.

Parametri:

  • idxName: il nome dell'indice.
  • tableName: il nome della tabella nel formato schema.name.
  • idxOption: eventuali opzioni aggiuntive da passare quando si elimina un indice. Ad esempio, un'opzione di algoritmo come INPLACE.

Sintassi:

mysql.dropSecondaryIdxOnReplica(idxName, tableName, idxOption)
      

Per i parametri idxType e idxOption, consulta la documentazione della versione principale di MySQL in esecuzione sull'istanza Cloud SQL.

Esempi

Uso corretto

Ecco alcune chiamate di esempio delle procedure. Supponiamo di avere una tabella con la definizione seguente.

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

Per creare un indice normale denominato t1_fname_lname nelle colonne first_name e last_name, esegui quanto segue:

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

Se volessi anche creare un indice univoco denominato t1_license_id nella colonna license_id con il commento "unique License id", dovresti eseguire quanto segue:

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

Se poi vuoi eliminare l'indice t1_fname_lname, esegui questo comando:

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

Utilizzo non corretto

Il seguente tentativo di creare un indice nelle colonne first_name e last_name non va a buon fine a causa delle parentesi esterne nel parametro idxDefinition.

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

Puoi aggiungere indici solo nelle tabelle create dal cliente. Il seguente tentativo di creare un indice nella colonna host della tabella mysql.servers ha esito negativo.

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

Puoi utilizzare la procedura dropSecondaryIdxOnReplica solo per eliminare gli indici creati in precedenza utilizzando la procedura addSecondaryIdxOnReplica. Ad esempio, la seguente chiamata per eliminare l'indice idx_fname esistente non va a buon fine.

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

L'SQL injection in queste chiamate di procedura non andrà a buon fine. Ad esempio, l'inserimento SQL seguente con una sequenza di commenti non andrà a buon fine.

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

Allo stesso modo, questo tentativo di SQL injection con un delimitatore non va a buon fine.

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

Ricreazione delle repliche di lettura

A volte, quando si verifica un problema, Cloud SQL ricrea una replica di lettura dall'origine principale per recuperare rapidamente l'istanza. Gli indici creati nella replica di lettura prima di un'operazione di ricreazione non vengono resi persistenti. È responsabilità del cliente ricreare questi indici utilizzando le procedure archiviate nella replica di lettura.

Passaggi successivi