インデックスのない列のヒストグラムを作成・管理する
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 dive を使用するため、ヒストグラムは通常効果がない (eq_range_index_dive_limit を超える場合を除く)。デフォルトの MANUAL モードでは、データが変化してもヒストグラムは更新されないため、ANALYZE ... UPDATE HISTOGRAM をスケジュールする。大きなテーブルは histogram_generation_max_mem_size に従ってサンプリングされる (sampling-rate < 1)。ANALYZE TABLE は短時間メタデータロックを取得する。ヒストグラムの更新はテーブル統計 (インデックスのカーディナリティ) を変更しない。