Todos los productos
Search
Centro de documentos

PolarDB:IMCI FAQ

Última actualización: Sep 17, 2026

Este tema responde a las preguntas más comunes sobre la función In-Memory Columnar Index (IMCI) de PolarDB for MySQL.

Cómo usar la función IMCI de PolarDB for MySQL

Para acelerar sus consultas con IMCI, siga estos pasos:

  1. Agregue un nodo de PolarDB for MySQL a su clúster de PolarDB for MySQL. Al agregar el nodo, asegúrese de habilitar la función IMCI. Para consultar las instrucciones, consulte Add a read-only IMCI node.

  2. Cree un IMCI en las tablas que requieran un mejor rendimiento de consulta. Utilice la instrucción CREATE TABLE o ALTER TABLE y agregue COLUMNAR=1 al campo COMMENT de la tabla. Una vez que el IMCI esté listo, el optimizador decide automáticamente si lo utiliza según el costo de la consulta. Para conocer los detalles de la sintaxis, consulte Create an IMCI when you create a table.

  3. Dirija sus consultas SQL al nodo de solo lectura IMCI. El optimizador utiliza automáticamente el IMCI para las consultas cuyo costo supera un umbral específico. Para obtener más información sobre el enrutamiento automático y manual de consultas, consulte Configure cluster endpoints to split traffic between row store and IMCI nodes.

Cómo comprobar el estado de un IMCI

Después de agregar un IMCI a una tabla existente mediante la instrucción ALTER TABLE, el índice se compila de forma asíncrona en el nodo de solo lectura IMCI. Para comprobar el estado, conéctese a su base de datos a través de un endpoint de clúster que tenga habilitada la distribución de solicitudes, o bien conéctese directamente al nodo de solo lectura IMCI. A continuación, consulte la tabla INFORMATION_SCHEMA.IMCI_INDEXES. Un IMCI está disponible para las consultas únicamente cuando su estado es COMMITTED. Para monitorear el progreso de compilación de un IMCI, consulte la tabla INFORMATION_SCHEMA.IMCI_ASYNC_DDL_STATS. Para obtener más información, consulte View index status.

Nota

Cuando inicia sesión en su base de datos con Data Management Service (DMS), se conecta de forma predeterminada al endpoint principal. Para conectarse a un endpoint de clúster o directamente a un nodo de solo lectura IMCI, siga estas instrucciones:

  • Conéctese a un endpoint de clúster.

    Inicie sesión en la consola de Data Management Service (DMS) 5.0. En la página Add Instance, establezca Entry method en Connection string e introduzca el endpoint del clúster. Para obtener más información, consulte Add a cloud database instance.

  • Conéctese directamente a un nodo de solo lectura IMCI.

    Primero, create a custom cluster endpoint para el nodo de solo lectura IMCI de destino y asegúrese de que el endpoint contenga únicamente ese nodo. Después, inicie sesión en la consola de Data Management Service (DMS) 5.0. En la página Add Instance, establezca Entry method en Connection string e introduzca el endpoint de clúster personalizado del nodo de solo lectura IMCI. Para obtener más información, consulte Add a cloud database instance.

Confirmar el uso de IMCI y consultar el plan de ejecución

Utilice la instrucción EXPLAIN para consultar el plan de ejecución de una consulta. Si en el resultado aparece un IMCI Execution Plan, significa que el IMCI aceleró la consulta. A continuación se muestra un ejemplo:

*************************** 1. row ***************************
IMCI Execution Plan (max_dop = 8, max_query_mem = 3435134976):
Project | Exprs: temp_table3.lineitem.L_ORDERKEY, temp_table3.SUM(lineitem.L_EXTENDEDPRICE * 1.00 - lineitem.L_DISCOUNT), temp_table3.orders.O_ORDERDATE, temp_table3.orders.O_SHIPPRIORITY
  Sort | Exprs: temp_table3.SUM(lineitem.L_EXTENDEDPRICE * 1.00 - lineitem.L_DISCOUNT) DESC,temp_table3.orders.O_ORDERDATE ASC
    HashGroupby | OutputTable(3): temp_table3 | Grouping: lineitem.L_ORDERKEY orders.O_ORDERDATE orders.O_SHIPPRIORITY | Output Grouping: lineitem.L_ORDERKEY, orders.O_ORDERDATE, orders.O_SHIPPRIORITY | Aggrs: SUM(lineitem.L_EXTENDEDPRICE * 1.00 - lineitem.L_DISCOUNT)
      HashJoin | HashMode: DYNAMIC | JoinMode: INNER | JoinPred: orders.O_ORDERKEY = lineitem.L_ORDERKEY
        HashJoin | HashMode: DYNAMIC | JoinMode: INNER | JoinPred: orders.O_CUSTKEY = customer.C_CUSTKEY
          CTableScan | InputTable(0): orders | Pred: (orders.O_ORDERDATE < 03/24/1995 00:00:00.000000)
          CTableScan | InputTable(1): customer | Pred: (customer.C_MKTSEGMENT = "BUILDING")
        CTableScan | InputTable(2): lineitem | Pred: (lineitem.L_SHIPDATE > 03/24/1995 00:00:00.000000)
1 row in set (0.04 sec)

El plan de ejecución de una consulta que usa un IMCI tiene una estructura de árbol donde cada nivel representa un operador. Por lo general, cada operador corresponde a una operación de la consulta SQL. Por ejemplo, el operador CTableScan examina una tabla, el operador HashJoin corresponde a una cláusula JOIN y el operador HashGroupby corresponde a una cláusula GROUP BY. Sin embargo, algunos operadores, como Sequence, se generan durante el proceso de optimización de la consulta y no se asignan directamente a ninguna operación de la consulta original.

Solucionar problemas de consultas que no usan IMCI

Un IMCI acelera una consulta solo si se cumplen varias condiciones: debe existir un IMCI en las tablas consultadas, el costo estimado de la consulta debe superar un umbral específico y la consulta debe dirigirse al nodo de solo lectura IMCI. Si una consulta no utiliza un IMCI, siga estos pasos de solución de problemas:

  1. Compruebe que la consulta se dirija al nodo de solo lectura IMCI.

    Use la función SQL Explorer and Audit para comprobar que la consulta se dirigió al nodo de solo lectura IMCI.

    Si utiliza un endpoint de clúster con la división automática de tráfico habilitada, PolarProxy dirige automáticamente al nodo de solo lectura IMCI las consultas cuyo costo estimado supere el valor de imci_ap_threshold. También puede forzar el enrutamiento de una consulta al nodo de solo lectura IMCI si agrega la sugerencia /*FORCE_IMCI_NODES*/ antes de la palabra clave SELECT. Ejemplo:

    /*FORCE_IMCI_NODES*/EXPLAIN SELECT COUNT(*) FROM t1 WHERE t1.a > 1;

    Para obtener más información, consulte Configure automatic traffic splitting.

    Nota

    Para garantizar que las consultas siempre se dirijan a un nodo de solo lectura IMCI, create a new endpoint that connects directly to it.

  2. Compruebe si el costo de la consulta supera el umbral.

    En un nodo de solo lectura IMCI, el optimizador estima el costo de una consulta. Si el costo estimado es mayor que el parámetro cost_threshold_for_imci, la consulta utiliza un IMCI. De lo contrario, utiliza un índice de filas estándar.

    Si ya confirmó que la consulta se dirigió al nodo de solo lectura IMCI, pero el plan de ejecución sigue sin mostrar el uso de IMCI, es posible que el costo estimado sea demasiado bajo. Consulte el costo estimado de la última consulta ejecutada mediante la variable Last_query_cost_for_imci:

    EXPLAIN SELECT * FROM t1;
    SHOW STATUS LIKE 'Last_query_cost_for_imci';

    Si el costo de ejecución estimado de una instrucción SQL es menor que el valor predefinido de cost_threshold_for_imci, considere ajustar cost_threshold_for_imci . Por ejemplo, utilice una sugerencia para ajustar el umbral predefinido de una sola instrucción SQL:

    /*FORCE_IMCI_NODES*/EXPLAIN SELECT /*+ SET_VAR(cost_threshold_for_imci=0) */ COUNT(*) FROM t1 WHERE t1.a > 1;
  3. Compruebe si todas las columnas utilizadas en la consulta están cubiertas por un IMCI.

    Utilice el procedimiento almacenado integrado dbms_imci.check_columnar_index() para check whether an IMCI has been created on the tables in a query. Ejemplo:

    CALL dbms_imci.check_columnar_index('SELECT COUNT(*) FROM t1 WHERE t1.a > 1');

    Si la consulta hace referencia a columnas que no están cubiertas por un IMCI, el procedimiento almacenado devuelve una lista con las tablas y columnas no cubiertas. Si todas las columnas están cubiertas, el procedimiento devuelve un conjunto de resultados vacío.

  4. Revise si hay funciones SQL no compatibles.

    Consulte Limits para confirmar que IMCI admite todas las funciones de su consulta.

Si todas estas comprobaciones son correctas, la consulta debería utilizar un IMCI.

¿Un nodo de solo lectura IMCI puede usar un índice de filas?

Sí. Un nodo de solo lectura IMCI es un nodo de solo lectura estándar con la función IMCI habilitada. Por lo tanto, admite tanto IMCI como índices de filas estándar. El optimizador elige qué índice utilizar según el valor de cost_threshold_for_imci.

Puede usar una sugerencia para establecer el umbral de costo de una sola consulta y obligarla a utilizar un IMCI:

SELECT /*+ SET_VAR(cost_threshold_for_imci=0) */ COUNT(*) FROM t1 WHERE t1.a > 1;

De igual manera, puede evitar que una consulta utilice un IMCI:

SELECT /*+ SET_VAR(USE_IMCI_ENGINE=OFF) */ COUNT(*) FROM t1 WHERE t1.a > 1;

Cómo crear un IMCI adecuado para una consulta

Para que una consulta utilice un IMCI, este debe cubrir todas las columnas a las que hace referencia. Si algunas columnas no están cubiertas, puede agregarlas a un IMCI mediante la instrucción CREATE TABLE o ALTER TABLE. PolarDB for MySQL proporciona varios procedimientos almacenados integrados para facilitar este proceso.

Utilice el procedimiento almacenado dbms_imci.columnar_advise() para generar la instrucción DDL necesaria para una consulta específica. Al crear un IMCI con esta instrucción DDL, se garantiza que todas las columnas de la consulta queden cubiertas. Para obtener más información, consulte Obtain the DDL statement to create an IMCI.

dbms_imci.columnar_advise('<query_string>');
Importante

Si utiliza un Multi-primary Cluster (Limitless), debe ejecutar este procedimiento almacenado en un nodo de solo lectura global. Puede agregar la sugerencia /*force_node='<node_id>'*/ antes de la instrucción SQL para forzar su ejecución en el nodo de solo lectura global especificado. Por ejemplo: /*force_node='pi-bpxxxxxxxx'*/ dbms_imci.columnar_advise('<query_string>');

Utilice las interfaces dbms_imci.columnar_advise_begin(), dbms_imci.columnar_advise_end() y dbms_imci.columnar_advise() para obtener las instrucciones DDL necesarias para un lote de consultas SQL. Para obtener más información, consulte Batch retrieve DDL statements to create IMCIs.

IMCI de PolarDB for MySQL: ¿Admite consultas paralelas en un solo nodo? De ser así, ¿cómo se personaliza el grado de paralelismo para una consulta SQL específica?

La consulta paralela en un solo nodo está habilitada de forma predeterminada. Ejecute EXPLAIN para consultar el plan de ejecución, donde el campo max_dop indica el grado de paralelismo real utilizado. Para personalizar el grado de paralelismo de una consulta específica, establezca el parámetro imci_max_dop a nivel de sesión antes de ejecutar la consulta. Por ejemplo:

set imci_max_dop=8; explain select xxxx

Alto uso de recursos y monitoreo

  • De forma predeterminada, IMCI se configura para ejecutar una sola consulta en paralelo, lo cual puede consumir todos los recursos de CPU disponibles. Cuando se ejecutan varias consultas de manera simultánea, el programador interno de la base de datos gestiona los recursos y reduce dinámicamente los límites de CPU y memoria de cada consulta. Como resultado, el uso promedio de CPU y memoria en un nodo de solo lectura IMCI suele ser mayor que en otros nodos. Puede controlar el grado máximo de paralelismo (el número máximo de núcleos de CPU) de una sola consulta si ajusta el parámetro imci_max_dop.

  • Se recomienda establecer el umbral de alerta de monitoreo en 70 % para el uso de CPU y en 90 % para el uso de memoria.

  • PolarDB for MySQL permite usar distintas especificaciones para diferentes nodos dentro del mismo clúster. Puede escalar verticalmente el nodo de solo lectura IMCI de forma independiente. Se recomienda que un nodo de solo lectura IMCI tenga como mínimo 8 núcleos de CPU y 16 GB de memoria.

PolarDB for MySQL 5.6 y 5.7: ¿Son compatibles con IMCI?

No. La función IMCI no es compatible con PolarDB for MySQL 5.6 ni 5.7. Solo se admite en PolarDB for MySQL 8.0 y versiones posteriores.

Límites de IMCI y compatibilidad con MySQL

IMCI es totalmente compatible con la sintaxis de MySQL. Sin embargo, algunas funciones de consulta menos comunes aún no se admiten por completo, como ciertas expresiones de tipos de datos espaciales, los índices de texto completo y algunas formas de subconsultas correlacionadas. Las consultas que utilizan estas funciones no se pueden acelerar con un IMCI y recurren automáticamente a un índice de filas estándar. Para consultar la lista detallada de límites, consulte Limits.

Uso de IMCI con INSERT/CREATE AS SELECT

Los IMCI solo se pueden usar para consultas en nodos de solo lectura, mientras que las instrucciones INSERT y CREATE solo se pueden ejecutar en el nodo principal. Por lo tanto, para acelerar la parte SELECT de una instrucción INSERT INTO SELECT o CREATE TABLE AS SELECT, debe utilizar la función ETL de IMCI. Para obtener más información, consulte Use IMCI to accelerate ETL.

Precios y cargos

La función IMCI no tiene costo. No obstante, para utilizarla debe agregar un nodo de solo lectura dedicado con IMCI habilitado. Se le facturará este nuevo nodo de solo lectura, así como el almacenamiento adicional que consuman los IMCI que cree.

Los nodos de solo lectura estándar no admiten IMCI.

Requisitos de almacenamiento

IMCI almacena los datos en formato columnar, lo que permite una alta relación de compresión. En comparación con el almacenamiento basado en filas, los IMCI logran una relación de compresión de 3:1 a 10:1. Esto generalmente implica un consumo de almacenamiento adicional de solo entre 10 % y 30 % del tamaño original de la tabla.

Consultar el uso de almacenamiento de IMCI

  • Para las versiones 8.0.1.1.32 y anteriores de clústeres de PolarDB for MySQL, consulte la tabla del sistema imci_columns en information_schema para ver el espacio de almacenamiento y la relación de compresión de una tabla con IMCI. Por ejemplo, para revisar el espacio de almacenamiento y la relación de compresión de la tabla test en la base de datos test, ejecute la siguiente instrucción SQL:

    SELECT
      SCHEMA_NAME, TABLE_NAME,
      SUM(EXTENT_SIZE * TOTAL_EXTENT_COUNT) AS TOTAL_SIZE,
      SUM(EXTENT_SIZE * USED_EXTENT_COUNT) AS USED_SIZE,
      SUM(EXTENT_SIZE * FREE_EXTENT_COUNT) AS FREE_SIZE,
      SUM(RAW_DATA_SIZE) / SUM(FILE_SIZE) AS COMPRESS
    FROM
      information_schema.imci_columns
    WHERE SCHEMA_NAME = 'test' AND TABLE_NAME = 'test';
  • Para las versiones 8.0.1.1.33 y posteriores de clústeres de PolarDB for MySQL, consulte la tabla del sistema imci_data_files en information_schema para ver el espacio de almacenamiento, y la tabla del sistema imci_columns para ver la relación de compresión. Por ejemplo, para revisar el espacio de almacenamiento y la relación de compresión de la tabla test en la base de datos test, ejecute las siguientes instrucciones SQL:

    • Consulte el espacio de almacenamiento que utiliza la tabla test con un IMCI:

      SELECT
          SCHEMA_NAME, TABLE_NAME,
          SUM(EXTENT_SIZE * TOTAL_EXTENT_COUNT) AS TOTAL_SIZE,
          SUM(EXTENT_SIZE * USED_EXTENT_COUNT) AS USED_SIZE,
          SUM(EXTENT_SIZE * FREE_EXTENT_COUNT) AS FREE_SIZE
      FROM
          INFORMATION_SCHEMA.IMCI_DATA_FILES
      WHERE SCHEMA_NAME = 'test' AND TABLE_NAME = 'test';
    • Consulte la relación de compresión de columnas:

      SELECT
          SCHEMA_NAME, TABLE_NAME,
           SUM(RAW_DATA_SIZE) / SUM(CMP_DATA_SIZE) AS COMPRESS_RATIO
      FROM
          INFORMATION_SCHEMA.IMCI_COLUMNS
      WHERE SCHEMA_NAME = 'test' AND TABLE_NAME = 'test';

En la siguiente tabla se describen los parámetros de las instrucciones SQL anteriores.

Parámetro

Descripción

SCHEMA_NAME

El nombre de la base de datos.

TABLE_NAME

El nombre de la tabla.

EXTENT_SIZE

El tamaño de una extensión, en bytes.

TOTAL_EXTENT_COUNT

El número total de extensiones.

USED_EXTENT_COUNT

El número de extensiones utilizadas.

FREE_EXTENT_COUNT

El número de extensiones libres.

RAW_DATA_SIZE

El tamaño de los datos de la columna antes de la compresión, en bytes.

FILE_SIZE

El tamaño de los datos de la columna después de la compresión, en bytes.

Nota

Este parámetro aplica a las versiones de PolarDB for MySQL anteriores a la 8.0.1.1.33.

CMP_DATA_SIZE

El tamaño de los datos de la columna después de la compresión, en bytes.

Nota

Este parámetro aplica a PolarDB for MySQL 8.0.1.1.33 y versiones posteriores.

DDL instantáneo con IMCI

  • En las versiones de PolarDB for MySQL anteriores a la 8.0.1.1.42 y a la 8.0.2.2.23, agregar una columna a una tabla con un IMCI a nivel de tabla no utiliza la lógica de DDL instantáneo. Esto se debe a que la operación requiere modificar la estructura del IMCI y recompilar los datos del índice.

  • En PolarDB for MySQL 8.0.1.1.42 y versiones posteriores, así como en la 8.0.2.2.23 y versiones posteriores, se admite el DDL instantáneo en tablas con un IMCI a nivel de tabla. Esta función no es compatible con el modo de reconstrucción de versiones anteriores. Debe establecer el parámetro imci_enable_add_column_instant_ddl en OFF y asegurarse de que la tabla tenga una clave principal.

Consultar o eliminar IMCI creados automáticamente

SELECT * FROM  information_schema.imci_autoindex_executed;

El procedimiento para eliminar un IMCI creado por autoindex es el mismo que para uno creado manualmente:

ALTER TABLE t1 comment 'columnar=0';

Rendimiento de ALTER TABLE con IMCI

Agregar o eliminar columnas normalmente implica reconstruir los datos de la tabla. Si la tabla tiene un IMCI, también deben reconstruirse los datos del IMCI. Este proceso de reconstrucción escribe en el registro Redo. Dado que un IMCI suele abarcar muchas columnas, la cantidad de datos del registro Redo generada es proporcional al tamaño de los datos originales de la tabla. Esto produce un volumen de E/S mayor en comparación con la reconstrucción de una tabla sin IMCI, lo que hace que la operación tarde más tiempo.

Impacto en el rendimiento de escritura

Crear un IMCI tiene un impacto mínimo en el rendimiento de escritura, generalmente inferior al 5 %. Las pruebas de Sysbench con oltp_insert workload muestran una disminución de rendimiento de aproximadamente 3 % después de crear un IMCI.

Niveles de aislamiento de transacciones admitidos

IMCI admite los niveles de aislamiento de transacciones READ_COMMITTED y REPEATABLE_READ.

Nota
  • Para usar un IMCI con el nivel de aislamiento de transacciones REPEATABLE_READ, debe conectarse mediante un endpoint personalizado que contenga únicamente el nodo de solo lectura IMCI.

  • En las versiones 8.0.1.1.40 y posteriores, así como en la 8.0.2.2.21 y posteriores de PolarDB for MySQL, algunas herramientas del ecosistema (como la herramienta de BI Metabase) pueden establecer implícitamente un nivel de aislamiento de transacciones no admitido, como READ_UNCOMMITTED. En esos casos, fuerce el uso de READ_COMMITTED si ejecuta SET imci_ignore_unsupported_isolation_level=ON. Como alternativa, agregue una variable de sesión a la cadena de conexión ODBC/JDBC. Por ejemplo, en Metabase puede agregar session Variables=imci_ignore_unsupported_isolation_level='ON' a la cadena de conexión.

Aceleración de consultas difusas

Sí. IMCI ofrece una excelente aceleración para los casos de uso de consultas difusas y admite operaciones como LIKE PRUMER, NGRAM LIKE y SMID LIKE. Además, la función de índice de texto completo columnar también acelera los casos de uso de consultas difusas.