Creazione e gestione degli indici sulle repliche di lettura

Questa pagina descrive come aggiungere ed eliminare indici sulle repliche di lettura Cloud SQL. Anche se una replica è normalmente di sola lettura, a volte potresti voler creare indici secondari nelle tabelle per la generazione di report. Cloud SQL offre un insieme di stored procedure per la gestione di questi indici.

Terminologia

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

Stored procedure per gli indici

Cloud SQL include due stored procedure nello schema mysql che puoi utilizzare per aggiungere ed eliminare indici secondari in una replica di lettura MySQL. Tieni presente che anche se queste procedure possono essere eseguite su un'istanza di origine principale, 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: tipo di indice da creare. Ad esempio, passa UNIQUE per creare un indice univoco.
  • idxName: il nome dell'indice.
  • tableName: nome della tabella nel formato schema.name.
  • idxDefinition: definizione dell'indice. Non includere le parentesi esterne.
  • idxOption: eventuali opzioni aggiuntive da trasmettere alla 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 nel database. Questa stored procedure è un wrapper per l'istruzione DDL DROP INDEX.

Parametri:

  • idxName: il nome dell'indice.
  • tableName: nome della tabella nel formato schema.name.
  • idxOption - Any additional options to pass when dropping an index. 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

Utilizzo corretto

Ecco alcuni esempi di invocazioni delle procedure. Supponiamo di avere una tabella con la seguente definizione.

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

Se vuoi creare un indice normale denominato t1_fname_lname nelle colonne first_name e last_name, esegui il seguente comando:

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 il seguente comando:

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

Se poi volessi eliminare l'indice t1_fname_lname, dovresti eseguire il seguente 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 riesce a causa delle parentesi esterne nel parametro idxDefinition.

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

Puoi aggiungere indici solo alle tabelle create dai clienti. Il seguente tentativo di creare un indice nella colonna host della tabella mysql.servers non va a buon fine.

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 procedure non andrà a buon fine. Ad esempio, la seguente iniezione SQL 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 ripristinare rapidamente l'istanza. Gli indici creati nella replica di lettura prima di un'operazione di ricreazione non vengono mantenuti. È responsabilità del cliente ricreare questi indici utilizzando le stored procedure sulla replica di lettura.

Passaggi successivi