DBAtlas · Атлас эксплуатации баз данных

Создание и управление гистограммами для неиндексированных столбцов

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; обновление гистограммы не меняет статистику таблицы (кардинальность индексов).

Открыть в DBAtlas →

Связанные материалы