Crear y gestionar índices en réplicas de lectura

En esta página se describe cómo añadir y eliminar índices en réplicas de lectura de Cloud SQL. Aunque una réplica suele ser de solo lectura, puede que en ocasiones quieras crear índices secundarios en tablas para generar informes. Cloud SQL ofrece un conjunto de procedimientos almacenados para gestionar estos índices.

Terminología

  • Índice de clúster. El índice principal de una tabla de MySQL que ordena físicamente las filas en el disco. Cuando defines una clave principal en una tabla, MySQL la usa como índice de clúster. Solo puede haber un índice clúster en una tabla.
  • Índice secundario. Un índice adicional en una tabla de MySQL que optimiza el rendimiento de las consultas.

Procedimientos almacenados para índices

Cloud SQL incluye dos procedimientos almacenados en el esquema mysql que puedes usar para añadir y eliminar índices secundarios en una réplica de lectura de MySQL. Ten en cuenta que, aunque estos procedimientos se pueden ejecutar en una instancia de origen principal, están diseñados para réplicas de lectura.

mysql.addSecondaryIdxOnReplica
Añade un índice secundario a la base de datos. Este procedimiento almacenado es un wrapper de la instrucción DDL CREATE INDEX.

Parámetros:

  • idxType: tipo de índice que se va a crear. Por ejemplo, transfiere UNIQUE para crear un índice único.
  • idxName: nombre del índice.
  • tableName: nombre de la tabla con el formato esquema.nombre.
  • idxDefinition: definición del índice. No incluyas los paréntesis exteriores.
  • idxOption: cualquier opción adicional que se quiera transferir a la creación del índice. Por ejemplo, en MySQL 8.0, una opción podría pasar INVISIBLE para un índice invisible.

Sintaxis:

mysql.addSecondaryIdxOnReplica(idxType, idxName, tableName, idxDefinition, idxOption)
     
mysql.dropSecondaryIdxOnReplica
Elimina un índice secundario de la base de datos. Este procedimiento almacenado es un wrapper de la instrucción DDL DROP INDEX.

Parámetros:

  • idxName: nombre del índice.
  • tableName: nombre de la tabla con el formato esquema.nombre.
  • idxOption: cualquier opción adicional que se deba transferir al eliminar un índice. Por ejemplo, una opción de algoritmo como INPLACE.

Sintaxis:

mysql.dropSecondaryIdxOnReplica(idxName, tableName, idxOption)
      

Para los parámetros idxType y idxOption, consulta la documentación de la versión principal de MySQL que se ejecuta en la instancia de Cloud SQL.

Ejemplos

Uso correcto

Aquí tienes algunos ejemplos de invocaciones de los procedimientos. Supongamos que tenemos una tabla con la siguiente definición.

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

Si quieres crear un índice normal llamado t1_fname_lname en las columnas first_name y last_name, ejecuta lo siguiente:

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

Si también quieres crear un índice único llamado t1_license_id en la columna license_id con el comentario "unique license id", ejecuta lo siguiente:

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

Si después quisieras eliminar el índice t1_fname_lname, ejecutarías lo siguiente:

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

Uso incorrecto

El siguiente intento de crear un índice en las columnas first_name y last_name falla debido a los paréntesis exteriores del parámetro idxDefinition.

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

Solo puedes añadir índices a tablas creadas por clientes. El siguiente intento de crear un índice en la columna host de la tabla mysql.servers falla.

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

Solo puedes usar el procedimiento dropSecondaryIdxOnReplica para eliminar los índices que hayas creado previamente con el procedimiento addSecondaryIdxOnReplica. Por ejemplo, la siguiente llamada para eliminar el índice idx_fname falla.

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

La inyección de SQL en estas llamadas de procedimiento fallará. Por ejemplo, la siguiente inyección de SQL con una secuencia de comentarios fallará.

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

Del mismo modo, este intento de inyección de SQL con un delimitador falla.

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

Recreación de réplicas de lectura

En ocasiones, cuando hay un problema, Cloud SQL vuelve a crear una réplica de lectura a partir de la fuente principal para recuperar la instancia rápidamente. Los índices creados en la réplica de lectura antes de una operación de recreación no se conservan. Es responsabilidad del cliente volver a crear estos índices mediante los procedimientos almacenados en la réplica de lectura.

Siguientes pasos