Heim >Datenbank >MySQL-Tutorial >Welche Indexkonfiguration (Bereichsspalte zuerst vs. Spalte mit niedriger Kardinalität zuerst) ist optimal für Bereichsabfragen für Spalten mit hoher und niedriger Kardinalität?

Welche Indexkonfiguration (Bereichsspalte zuerst vs. Spalte mit niedriger Kardinalität zuerst) ist optimal für Bereichsabfragen für Spalten mit hoher und niedriger Kardinalität?

DDD
DDDOriginal
2024-12-16 05:49:10171Durchsuche

Which Index Configuration (Range Column First vs. Low Cardinality Column First) Is Optimal for Range Queries on High and Low Cardinality Columns?

Welche Indexkonfiguration ist optimal, wenn mit Bereichsabfragen mit Spalten mit hoher und niedriger Kardinalität gearbeitet wird?

Im gegebenen Szenario haben wir eine Tabelle „Dateien“ mit einem Primärschlüssel für „did“ und „Dateiname“ und zwei zusätzlichen Indizes: „fe“ für „filetime“ und „ext“ und „ef“ auf 'ext' und 'filetime'. Unsere Abfrage umfasst das Filtern von Zeilen basierend auf „ext“ und „filetime“ unter Verwendung von Bereichsbedingungen.

Lassen Sie uns untersuchen, welche Indexkonfiguration für diese Abfrage effizienter ist.

Indexoptionen auswerten

Um den optimalen Index zu ermitteln, können wir die potenzielle Indexnutzung und Kostenschätzungen analysieren ERKLÄREN:

Fe erzwingen (Bereichsspalte zuerst):

EXPLAIN SELECT COUNT(*), AVG(fsize)
FROM files FORCE INDEX(fe)
WHERE ext = 'gif' AND filetime >= '2015-01-01' AND filetime < '2015-01-01' + INTERVAL 1 MONTH;

Ef erzwingen (Spalte mit niedriger Kardinalität zuerst):

EXPLAIN SELECT COUNT(*), AVG(fsize)
FROM files FORCE INDEX(ef)
WHERE ext = 'gif' AND filetime >= '2015-01-01' AND filetime < '2015-01-01' + INTERVAL 1 MONTH;

Analyse

EXPLAIN legt das nahe Die Verwendung von „ef“ (Spalte mit niedriger Kardinalität zuerst) führt zu einem effizienteren Ausführungsplan im Vergleich zu „fe“. Dies liegt daran, dass „ef“ es dem Optimierer ermöglicht, Zeilen mithilfe beider Spalten des Index zu filtern, was zu geringeren geschätzten Kosten führt.

Optimierer-Trace

Der Optimierer-Trace bietet zusätzliche Einblicke in die Indexauswertung Prozess:

"potential_range_indices": [
    {
        "index": "fe",
        "usable": true
    },
    {
        "index": "ef",
        "usable": true
    }
],
"analyzing_range_alternatives": {
    "range_scan_alternatives": [
        {
            "index": "fe",
            "ranges": [...],
            "index_only": false,
            "rows": 16684,
            "cost": 20022
        },
        {
            "index": "ef",
            "ranges": [...],
            "index_only": false,
            "rows": 538,
            "cost": 646.61
        }
    ]
},
"attached_conditions_computation": [
    {
        "access_type_changed": {
            "table": "`files`",
            "index": "ef",
            "old_type": "ref",
            "new_type": "range",
            "cause": "uses_more_keyparts"
        }
    }
]

Schlussfolgerungen

Der Optimierer-Trace bestätigt, dass:

  • „fe“ (Bereichsspalte zuerst) nur verwendet erste Spalte zum Filtern.
  • „ef“ (Spalte mit niedriger Kardinalität zuerst) nutzt beide Spalten des Index für Filterung.
  • Der Optimierer priorisiert die Verwendung von Spalten, die an Bereichsbedingungen beteiligt sind, unabhängig von Kardinalitäten, wenn er zusammengesetzte Indizes erstellt.
  • Kardinalität ist für zusammengesetzte Indizes in dieser Art von Abfrageszenario weniger relevant.

Unter Berücksichtigung sowohl der EXPLAIN-Ausgabe als auch des Optimizer-Trace ist daher die optimale Indexkonfiguration ef (ext, filetime) für Abfragen, die sowohl ext- als auch filetime-Bereichsbedingungen betreffen. Indem wir die Spalte mit niedriger Kardinalität an die erste Stelle im Index setzen, ermöglichen wir dem Optimierer, beide Spalten effektiv zu nutzen, was zu einem effizienteren Ausführungsplan führt.

Das obige ist der detaillierte Inhalt vonWelche Indexkonfiguration (Bereichsspalte zuerst vs. Spalte mit niedriger Kardinalität zuerst) ist optimal für Bereichsabfragen für Spalten mit hoher und niedriger Kardinalität?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn