Создание и управление гистограммами для неиндексированных столбцов
MySQLИндексы и статистикаКоманда
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;Что делает
Сохраняет распределение значений столбца (singleton или equi-height) в словаре данных; оптимизатор правильно оценивает селективность фильтров по неиндексированным столбцам, что улучшает порядок соединений и качество плана.
Когда использовать
Когда EXPLAIN ANALYZE показывает большое расхождение оценочных и фактических строк на столбцах с перекосом (например, status, type), где добавлять индекс нежелательно.
Внимание
Для индексированных столбцов оптимизатор использует index dives, поэтому гистограмма обычно не влияет (если не превышен eq_range_index_dive_limit). В режиме MANUAL по умолчанию гистограмма не обновляется при изменении данных; запланируйте ANALYZE ... UPDATE HISTOGRAM. Большие таблицы сэмплируются в соответствии с histogram_generation_max_mem_size (sampling-rate < 1). ANALYZE TABLE берёт кратковременный metadata lock; обновление гистограммы не меняет статистику таблицы (кардинальность индексов).