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.
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: |
|
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 |
|
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. |
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);
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;
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 |
|
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 |
|
|
La columna a es BIGINT. La discrepancia de tipos desencadena un CAST implícito. |
|
|
El argumento de la agregación es una expresión. |
|
|
El argumento de GROUP BY es una expresión. |
|
No existe una reescritura equivalente. Aplique el filtro en la capa de aplicación. |
Comparación entre columnas. |
|
|
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 |
|
|
= |
a = 1 |
|
|
>, >=, <, <= |
a > 1 |
|
|
IS NULL / IS NOT NULL |
a IS NULL |
|
|
AND / OR / NOT / != |
a = 1 AND b = 2 |
|
|
LIKE |
a LIKE "%s%" |
|
|
IN |
a IN (1,2,3) |
|
|
TEXT_MATCH |
TEXT_MATCH(a, "hello") |
|
|
TEXT_MATCH_PHRASE |
TEXT_MATCH_PHRASE(a, "hello world") |
|
|
ARRAY_EXTRACT |
ARRAY_EXTRACT(col) |
|
|
NESTED_QUERY |
NESTED_QUERY(expr) |
|
|
ORDER BY / LIMIT |
ORDER BY a LIMIT 10 |
|
|
Funciones de agregación / GROUP BY |
SUM(col) / GROUP BY col |