DBAtlas · Atlas de operaciones de bases de datos

Crear y gestionar histogramas para columnas no indexadas

MySQLÍndices y estadísticas

Comando

ANALYZE TABLE shop.big UPDATE HISTOGRAM ON status WITH 64 BUCKETS;
-- 8.4+: histogram refreshed automatically as data changes
ANALYZE TABLE shop.big UPDATE HISTOGRAM ON status WITH 64 BUCKETS AUTO UPDATE;

SELECT SCHEMA_NAME, TABLE_NAME, COLUMN_NAME,
       HISTOGRAM->>'$."histogram-type"' AS type,
       JSON_LENGTH(HISTOGRAM->'$.buckets') AS buckets,
       HISTOGRAM->>'$."last-updated"' AS last_updated,
       HISTOGRAM->>'$."sampling-rate"' AS sampling_rate
FROM information_schema.COLUMN_STATISTICS;

ANALYZE TABLE shop.big DROP HISTOGRAM ON status;

Qué hace

Almacena la distribución de valores de una columna (singleton o equi-height) en el diccionario de datos; el optimizador estima correctamente la selectividad de los filtros sobre columnas no indexadas, mejorando el orden de join y la calidad del plan.

Cuándo usarlo

Cuando EXPLAIN ANALYZE muestra una gran diferencia entre filas estimadas y reales en columnas sesgadas (p. ej. status, type) donde no conviene añadir un índice.

Precaución

En columnas indexadas el optimizador usa index dives, por lo que un histograma normalmente no tiene efecto (salvo que se supere eq_range_index_dive_limit). En el modo MANUAL por defecto el histograma no se refresca al cambiar los datos; programe ANALYZE ... UPDATE HISTOGRAM. Las tablas grandes se muestrean según histogram_generation_max_mem_size (sampling-rate < 1). ANALYZE TABLE toma un metadata lock breve; actualizar un histograma no cambia las estadísticas de la tabla (cardinalidad de índices).

Abrir en DBAtlas →

Relacionado