En una base de datos distribuida, las consultas que filtran por una columna de índice pero devuelven columnas no indexadas requieren una búsqueda en la tabla. Esto implica recuperar los datos de la tabla base después de encontrar las entradas de índice coincidentes. Este viaje de ida y vuelta adicional genera E/S de red y aumenta la latencia de la consulta.
Un índice agrupado elimina esta sobrecarga. Se trata de un tipo especial de índice secundario global (GSI) que incluye todas las columnas de la tabla base. Las consultas atendidas desde un índice agrupado recuperan todas las columnas necesarias sin examinar la tabla base, lo que reduce tanto la E/S como la latencia de la consulta.
PolarDB-X gestiona automáticamente la cobertura de columnas y mantiene el índice agrupado sincronizado con la tabla base.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Una instancia de PolarDB-X que ejecute la versión del kernel V5.4.9 o posterior.
Funcionamiento
Cuando se agrega la palabra clave CLUSTERED a la definición de un índice, PolarDB-X crea una tabla de índice que replica todas las columnas de la tabla base. Las lecturas se dirigen directamente a esta tabla de índice y omiten el examen de la tabla base. Cualquier actualización de columnas en la tabla base se propaga automáticamente al índice agrupado. Los índices locales de la tabla base también se sincronizan con la tabla del índice agrupado.
Crear un índice agrupado
Agregue la palabra clave CLUSTERED a cualquier definición de índice. PolarDB-X admite tres métodos.
Crear una tabla con un índice agrupado
CREATE [SHADOW] TABLE [IF NOT EXISTS] tbl_name
(create_definition, ...)
[table_options]
[drds_partition_options]
create_definition:
[UNIQUE] CLUSTERED INDEX index_name [index_type] (index_col_name,...)
[drds_partition_options]
[index_option] ...
Si la tabla usa su clave primaria como clave de fragmentación, omita la regla de fragmentación en [drds_partition_options] .
Agregar un índice agrupado a una tabla existente
Con CREATE INDEX:
CREATE [UNIQUE]
CLUSTERED INDEX index_name [index_type]
ON tbl_name (index_col_name,...)
[drds_partition_options]
[index_option] ...
Si la tabla usa su clave primaria como clave de fragmentación, omita la regla de fragmentación en [drds_partition_options] .
Con ALTER TABLE:
ALTER TABLE tbl_name
alter_specification
alter_specification:
| ADD [UNIQUE] CLUSTERED {INDEX|KEY} index_name
[index_type] (index_col_name,...)
[drds_partition_options]
[index_option] ...
Al usar ALTER TABLE :
Especifique solo una regla de fragmentación en la cláusula alter_specification .
Proporcione siempre un nombre para el índice agrupado.
Si la tabla usa su clave primaria como clave de fragmentación, omita la regla de fragmentación en [drds_partition_options] .
Ejemplo
A continuación se muestra cómo crear una tabla particionada, agregar un índice agrupado en seller_id y x, y comprobar el resultado.
Cree la tabla base:
CREATE PARTITION TABLE `t_order` (
`t` timestamp null default CURRENT_TIMESTAMP,
`x` int default 3,
`order_id` varchar(20) DEFAULT NULL,
`seller_id` varchar(20) DEFAULT NULL
);
Cree el índice agrupado:
CREATE CLUSTERED INDEX `c_i` ON `t_order` (seller_id, x)
Compruebe el esquema de la tabla base:
SHOW CREATE TABLE t_order;
La salida muestra tanto la clave local como la entrada del índice agrupado:
+---------+-----------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+-----------------------------------------------------------------------------------------------+
| t_order | CREATE PARTITION TABLE `t_order` (
`t` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`x` int(11) DEFAULT '3',
`order_id` varchar(20) DEFAULT NULL,
`seller_id` varchar(20) DEFAULT NULL,
LOCAL KEY `_local_c_i` (`seller_id`, `x`),
CLUSTERED INDEX `c_i`(`seller_id`, `x`) DBPARTITION BY HASH(`seller_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 |
+---------+-----------------------------------------------------------------------------------------------+
1 row in set (0.08 sec)
Compruebe el esquema del índice agrupado:
SHOW CREATE TABLE c_i;
La salida confirma que el índice agrupado contiene todas las columnas de la tabla base:
+-------+---------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------------------------------------------------+
| c_i | CREATE TABLE `c_i` (
`t` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`x` int(11) DEFAULT '3',
`order_id` varchar(20) DEFAULT NULL,
`seller_id` varchar(20) DEFAULT NULL,
KEY `auto_shard_key_seller_id` USING BTREE (`seller_id`),
KEY `i_seller_id_x` USING BTREE (`seller_id`, `x`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 dbpartition by hash(`seller_id`) |
+-------+---------------------------------------------------------------------------------------------------+
1 row in set (0.03 sec)
Pasos siguientes
Para ver la lista completa de operaciones y límites aplicables a los índices agrupados, consulte GSI.