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.