Heim > Datenbank > MySQL-Tutorial > Welcher MySQL-Index ist für Bereichsabfragen effizienter: Führend mit Spalte mit hoher oder niedriger Kardinalität?

Welcher MySQL-Index ist für Bereichsabfragen effizienter: Führend mit Spalte mit hoher oder niedriger Kardinalität?

Barbara Streisand
Freigeben: 2024-11-29 02:55:14
Original
578 Leute haben es durchsucht

Which MySQL Index Is More Efficient for Range Queries: Leading with High or Low Cardinality Column?

Indexoptimierung für Bereichsabfragen

Spalten mit höherer Kardinalität tragen zu effizienteren Indizes in MySQL bei. Bei Bereichsabfragen gilt jedoch eine Ausnahme.

Problemstellung

Betrachten Sie eine Tabelle mit der folgenden Struktur:

CREATE TABLE `files` (
  `did` int(10) UNSIGNED NOT NULL DEFAULT '0',
  `filename` VARBINARY(200) NOT NULL,
  `ext` VARBINARY(5) DEFAULT NULL,
  `fsize` DOUBLE DEFAULT NULL,
  `filetime` DATETIME DEFAULT NULL,
  PRIMARY KEY (`did`,`filename`),
  KEY `fe` (`filetime`,`ext`),          -- Option 1
  KEY `ef` (`ext`,`filetime`)           -- Option 2
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Nach dem Login kopieren

Filetimes sind unterschiedlich, während es eine begrenzte Anzahl von Ext-Werten gibt (d. h. höhere Kardinalität für Filetime, niedrigere Kardinalität für Ext). Eine Abfrage umfasst beide Spalten mit den folgenden Bedingungen:

WHERE ext = '...'
AND filetime BETWEEN ... AND ...
Nach dem Login kopieren

Welcher Index, fe oder ef, ist optimaler?

Antwort

Überraschenderweise , ist der Index mit ext als erster Spalte trotz seiner geringeren Kardinalität hierfür effizienter Abfrage.

Erklärung

Der MySQL-Optimierer analysiert Indexalternativen und wählt diejenige mit den niedrigsten Kosten aus. Mithilfe des Optimierer-Trace können wir die Gründe für diese Wahl beobachten.

Zum Beispiel (filetime first) schätzt MySQL, dass es 16684 Zeilen scannen müsste, um „gif“-Dateien zu finden, selbst wenn die Bereichsbedingung aktiviert ist filetime.

Für ef (ext first) wird jedoch geschätzt, dass es beide Indexspalten verwenden und schnell einen Drilldown zu den entsprechenden Zeilen durchführen kann, was zu Kosten von nur führt 646,61. MySQL wählt diesen Index, da er mehr Schlüsselteile verwenden kann, was die Suche effizienter macht.

Schlussfolgerungen

  • Priorisieren Sie Spalten, die an Gleichheitstests im Index beteiligt sind. unabhängig von der Kardinalität.
  • Der Abfrageplan erstreckt sich nicht über die erste Bereichsspalte hinaus.
  • In In diesem Zusammenhang ist die Kardinalität für zusammengesetzte Indizes und Bereichsabfragen irrelevant.
  • InnoDB kann Indexspalten verwenden, die über die zum Filtern verwendeten hinausgehen („Indexbedingung verwenden“).

Das obige ist der detaillierte Inhalt vonWelcher MySQL-Index ist für Bereichsabfragen effizienter: Führend mit Spalte mit hoher oder niedriger Kardinalität?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage