En esta página, se describe cómo agregar y descartar índices en las réplicas de lectura de Cloud SQL. Si bien una réplica suele ser de solo lectura, es posible que quieras crear índices secundarios en tablas para generar informes. Cloud SQL ofrece un conjunto de procedimientos almacenados para administrar estos índices.
Terminología
- Índice agrupado. El índice principal de una tabla de MySQL que ordena de forma física las filas en el disco. Cuando defines una clave primaria en una tabla, MySQL la usa como el índice agrupado. Solo puede haber un índice agrupado en una tabla.
- Índice secundario. Un índice adicional en una tabla 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 agregar y descartar índices secundarios en una réplica de lectura de MySQL. Ten en cuenta que, si bien estos procedimientos pueden ejecutarse en una instancia de origen principal, están diseñados para réplicas de lectura.
- mysql.addSecondaryIdxOnReplica
- Agrega un índice secundario a la base de datos. Este procedimiento almacenado es un wrapper de la declaración DDL CREATE INDEX.
Parámetros:
idxType
: Tipo de índice que se creará. Por ejemplo, pasa UNIQUE para crear un índice único.idxName
: Nombre del índice.tableName
: Nombre de la tabla en el formato de schema.name.idxDefinition
: Definición del índice. No incluyas paréntesis externos.idxOption
: Cualquier opción adicional para pasar 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
- Agrega un índice secundario a la base de datos. Este procedimiento almacenado es un wrapper de la declaración DDL DROP INDEX.
Parámetros:
idxName
: Nombre del índice.tableName
: Nombre de la tabla en el formato de schema.name.idxOption
: cualquier opción adicional para pasar cuando se descarta 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
Estas son algunas invocaciones de ejemplo 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 deseas crear un índice normal llamado t1_fname_lname
en las columnas first_name
y last_name
, debes ejecutar lo siguiente:
call mysql.addSecondaryIdxOnReplica('', 't1_fname_lname', 'sampletest.t1', 'first_name, last_name', '')
Si también quisieras crear un índice único llamado t1_license_id
en la columna license_id
con el comentario “ID de licencia único”, ejecutarías lo siguiente:
call mysql.addSecondaryIdxOnReplica('unique', 't1_license_id', 'sampletest.t1', 'license_id', 'comment \"unique license id\"')
Si deseas descartar el índice t1_fname_lname, debes ejecutar lo siguiente:
call mysql.dropSecondaryIdxOnReplica('t1_fname_lname', 'sampletest.t1', '')
Uso incorrecto
El siguiente intento para crear un índice en las columnas first_name
y last_name
falla debido a los paréntesis externos en el parámetro idxDefinition.
call mysql.addSecondaryIdxOnReplica('', 't1_extra_parenthesis', 'sampletest.t1', '(first_name, last_name)', '')
Solo puedes agregar índices en las tablas creadas por el cliente. El siguiente intento de crear un índice en la columna de host de la tabla mysql.servers falla.
call mysql.addSecondaryIdxOnReplica('', 'idx_invalid', 'mysql.servers', 'host', '')
Solo puedes usar el procedimiento dropSecondaryIdxOnReplica
para descartar los índices que creaste antes mediante el procedimiento addSecondaryIdxOnReplica
. Por ejemplo, la siguiente llamada para descartar el índice idx_fname
existente falla.
call mysql.dropSecondaryIdxOnReplica('idx_fname', 'sampletest.t1', '')
La inserció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 inserció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 desde la fuente principal para recuperar la instancia con rapidez. No se conservan los índices creados en la réplica de lectura antes de una operación de recreación. Es responsabilidad del cliente volver a crear estos índices con los procedimientos almacenados en la réplica de lectura.