Crear y gestionar histogramas para columnas no indexadas
MySQLÍndices y estadísticasComando
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).