Todos los productos
Search
Centro de documentos

Tablestore:Optimización de consultas

Última actualización: Sep 03, 2026

El motor SQL de Tablestore optimiza las consultas al seleccionar el mejor índice para la lectura de datos y delegar la computación a la capa de índices.

Selección de índices

Cuando una tabla de datos cuenta con Secondary index o Search index, el motor SQL determina la ruta de lectura óptima antes de ejecutar la consulta. El índice se puede seleccionar automáticamente o especificar de forma manual.

Nota

Antes de utilizar la optimización de consultas, asegúrese de haber creado los mapeos de la tabla de datos. Para obtener más información, consulte DDL operations. Si desea acelerar las consultas mediante un índice de búsqueda, cree también dicho índice junto con su mapeo.

Reglas de selección automática

Al consultar un mapeo de tabla de datos, el motor SQL selecciona automáticamente un índice según la siguiente prioridad:

Prioridad

Objetivo

Condición

1

Índice de búsqueda

Todas las columnas en las cláusulas WHERE, de agregación y ORDER BY están cubiertas por el mismo índice de búsqueda.

Ejemplo: SELECT A,B,C FROM t WHERE A=1 AND D=2; — Si las columnas A, B, C y D pertenecen al mismo índice de búsqueda, se selecciona este índice.

2

Índice secundario

El índice secundario coincide con más columnas iniciales de la clave primaria en la cláusula WHERE que la tabla de datos (coincidencia de prefijo más a la izquierda) y cubre todas las columnas de la consulta.

Ejemplo: La tabla de datos tiene las claves primarias a y b. Un índice secundario tiene las claves primarias c, a y b. Para WHERE c = 1 AND a > 1, el índice secundario coincide con 2 columnas > la tabla de datos coincide con 1 columna.

3

Decisión del CBO

Si ninguna regla aplica, el motor SQL utiliza el CBO interno (optimizador basado en costos) para elegir la opción de menor costo entre la tabla de datos y los índices secundarios.

Importante
  • Si el mapeo está configurado con consistencia fuerte o requiere resultados de agregación exactos, el motor SQL no selecciona automáticamente un índice de búsqueda.

  • Cuando tanto un índice secundario como un índice de búsqueda cubren todas las columnas necesarias, el motor SQL da preferencia al índice de búsqueda.

Especificar un índice manualmente

Para utilizar un índice específico, especifíquelo manualmente mediante uno de los siguientes métodos:

Sintaxis use index

Especifique un índice en la instrucción SELECT.

-- Force a full table scan (skip all indexes)
SELECT * FROM sampletable use index();

-- Use a search index
SELECT * FROM sampletable use index(sampletable_search_index);

-- Use a secondary index
SELECT * FROM sampletable use index(sampletable_secondary_index);
Nota

Si el índice especificado no cubre las columnas obligatorias, el motor SQL lee automáticamente los datos faltantes desde la tabla de datos.

Tabla de mapeo de índices

Consulte directamente la tabla de mapeo de un índice secundario o de búsqueda.

-- Query through a search index mapping table (only columns in the index are queryable)
SELECT col_a, col_b FROM search_index_mapping WHERE col_a > 10;
Nota

Las consultas en una tabla de mapeo de índices solo pueden devolver las columnas incluidas en dicho índice.

Recomendaciones

Escenario

Recomendación

Agregación, ordenamiento o búsqueda de texto completo

Utilice la selección automática (predeterminado). Asegúrese de que el índice de búsqueda cubra todas las columnas necesarias. El motor SQL enruta la consulta al índice de búsqueda y delega los operadores automáticamente.

Filtros simples de igualdad o rango con consistencia fuerte

Utilice un índice secundario. Los índices secundarios admiten lecturas con consistencia fuerte cuando se requieren datos en tiempo real.

La selección automática produce resultados inesperados

Especifique manualmente un índice con use index(index_name). Esto resulta útil para ajustar el rendimiento o corregir decisiones erróneas del CBO.

Solo se necesitan las columnas del índice

Consulte directamente la tabla de mapeo del índice para evitar lecturas desde la tabla de datos.

Delegación de computación

El motor SQL delega los operadores compatibles a la capa del índice de búsqueda, lo que reduce el volumen de datos que debe procesar.

Condiciones de activación

La delegación de computación requiere que el índice de búsqueda cubra todas las columnas de la instrucción SQL, incluidas las columnas SELECT, WHERE, ORDER BY y GROUP BY. Si falta alguna columna, el motor SQL recurre a un escaneo completo de la tabla.

-- Table has columns a, b, c, d. Search index covers a, b, c.

-- d is not in the search index → full table scan, no pushdown
SELECT a, b, c, d FROM exampletable;

-- All columns are in the search index → reads through search index, pushdown supported
SELECT a, b, c FROM exampletable;

Operadores compatibles

Tipo de operador

Compatibilidad con delegación

Condiciones

Operadores lógicos

AND, OR

NOT no se puede delegar.

Operadores relacionales

=, !=, <, <=, >, >=, BETWEEN...AND

Solo se admiten comparaciones de columna contra constante. Las comparaciones entre columnas no se pueden delegar porque los índices de búsqueda crean índices independientes por columna y no pueden resolver comparaciones cruzadas en la capa de índices.

Funciones de agregación

MIN, MAX, COUNT, AVG, SUM, ANY_VALUE, COUNT(DISTINCT), GROUP BY

Los argumentos deben ser nombres de columnas, no expresiones. COUNT(*) admite delegación.

Ordenamiento y paginación

ORDER BY col LIMIT n

Los argumentos de ORDER BY deben ser nombres de columnas. Las expresiones en ORDER BY no se pueden delegar.

Funciones vectoriales

VECTOR_QUERY_FLOAT32

Todas las demás expresiones en la cláusula WHERE también deben cumplir las condiciones de delegación. Si alguna no las cumple, la consulta no se puede ejecutar.

Antipatrones comunes

Antipatrón

Patrón corregido

Razón

WHERE a = '123'
WHERE a = 123

La columna a es BIGINT. La discrepancia de tipos desencadena un CAST implícito.

SELECT SUM(a+b)
SELECT SUM(a)+SUM(b)

El argumento de la agregación es una expresión.

GROUP BY a+1
GROUP BY a

El argumento de GROUP BY es una expresión.

WHERE a > b

No existe una reescritura equivalente. Aplique el filtro en la capa de aplicación.

Comparación entre columnas.

ORDER BY a+1 LIMIT 10
ORDER BY a LIMIT 10

El argumento de ORDER BY es una expresión.

Expresiones SQL y mapeo de funciones del índice de búsqueda

A continuación se presenta una tabla que relaciona las expresiones SQL con sus funciones equivalentes de consulta del índice de búsqueda, para facilitar la migración del SDK del índice de búsqueda a SQL.

Expresión SQL

Ejemplo

Función del índice de búsqueda

Sin cláusula WHERE

SELECT * FROM t

MatchAllQuery

=

a = 1

TermQuery

>, >=, <, <=

a > 1

RangeQuery

IS NULL / IS NOT NULL

a IS NULL

ExistsQuery

AND / OR / NOT / !=

a = 1 AND b = 2

BoolQuery

LIKE

a LIKE "%s%"

WildcardQuery

IN

a IN (1,2,3)

TermsQuery

TEXT_MATCH

TEXT_MATCH(a, "hello")

MatchQuery

TEXT_MATCH_PHRASE

TEXT_MATCH_PHRASE(a, "hello world")

MatchPhraseQuery

ARRAY_EXTRACT

ARRAY_EXTRACT(col)

Array and Nested data types

NESTED_QUERY

NESTED_QUERY(expr)

NestedQuery

ORDER BY / LIMIT

ORDER BY a LIMIT 10

Sorting and paging

Funciones de agregación / GROUP BY

SUM(col) / GROUP BY col

Aggregation