DBAtlas · Atlas für Datenbankbetrieb

Histogramme für nicht indizierte Spalten erstellen und verwalten

MySQLIndex & Statistiken

Befehl

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;

Was es tut

Speichert die Werteverteilung einer Spalte (singleton oder equi-height) im Data Dictionary; der Optimizer schätzt die Selektivität von Filtern auf nicht indizierten Spalten korrekt und verbessert so Join-Reihenfolge und Planqualität.

Wann einsetzen

Wenn EXPLAIN ANALYZE bei ungleich verteilten Spalten (z. B. status, type), auf denen kein Index gewünscht ist, eine große Abweichung zwischen geschätzten und tatsächlichen Zeilen zeigt.

Vorsicht

Auf indizierten Spalten nutzt der Optimizer Index Dives, daher hat ein Histogramm dort meist keine Wirkung (außer eq_range_index_dive_limit wird überschritten). Im Standardmodus MANUAL wird das Histogramm bei Datenänderungen nicht aktualisiert; plane ANALYZE ... UPDATE HISTOGRAM ein. Große Tabellen werden gemäß histogram_generation_max_mem_size per Stichprobe erfasst (sampling-rate < 1). ANALYZE TABLE nimmt kurz einen Metadata Lock; das Aktualisieren eines Histogramms ändert die Tabellenstatistiken (Index-Kardinalität) nicht.

In DBAtlas öffnen →

Verwandte Einträge