Ich verwende die InnoDB-Engine auf MySQL 5.7.MySQL - Ungleichmäßige Verteilung von Daten in Partitionen bei Verwendung der Schlüsselpartitionierung
Ich habe eine Tabelle, in der eine der Spalten ein (nicht eindeutiger) dreibuchstabiger Ländercode ist (z. B. "SGP" für Singapur, "JPN" für Japan usw.).
Für die meisten meiner Abfragen dieser Spalte Ländercode ist die erste Klausel WHERE I (z
WHERE COUNTRY_CODE = 'SGP'
)Daher filtern, ich will nach dieser Spalte der Tabelle zu (Teil-) Partition. Da die meisten meiner Abfragen auf einem einzelnen Ländercode basieren, werden sie nur eine Partition auf diese Weise treffen.
Aufgrund der großen Anzahl der verschiedenen Ländercodes möchte ich jedoch nicht die LIST-Partitionierung verwenden, bei der ich explizit auf jeden einzelnen Ländercode eingehen muss.
Also habe ich KEY Partitionierung mit 8 Partitionen verwendet. Ich dachte, dass die Schlüsselpartitionierung, bei der der Wert hashed wird, mir eine mehr oder weniger gleichmäßige Verteilung über die 8 Partitionen geben würde (muss nicht perfekt sein).
Was ich jedoch erlebt habe, ist, dass von den 8 Partitionen 4 von ihnen völlig unberührt sind. Dieses
ist ein Auszug aus meiner CREATE TABLE-Anweisung:
CREATE TABLE TBL_EATING_PLACES (
ID INT UNSIGNED AUTO_INCREMENT NOT NULL,
TYPE_OF_FOOD SMALLINT UNSIGNED NOT NULL,
SUBTYPE_OF_FOOD SMALLINT UNSIGNED NOT NULL,
COUNTRY_CODE CHAR(3) NOT NULL,
ADDRESS VARCHAR(255),
...
OTHER_NON_RELEVANT_COLUMNS ...,
...,
CONSTRAINT PKEY PRIMARY KEY (ID, TYPE_OF_FOOD, SUBTYPE_OF_FOOD, COUNTRY_CODE)
)
ENGINE = InnoDB
PARTITION BY LIST COLUMNS(TYPE_OF_FOOD, SUBTYPE_OF_FOOD) SUBPARTITION BY KEY(COUNTRY_CODE) SUBPARTITIONS 8 (
PARTITION P_1_1 VALUES IN ((1, 1)),
PARTITION P_1_2 VALUES IN ((1, 2)),
PARTITION P_2_1 VALUES IN ((2, 1)),
PARTITION P_1_2 VALUES IN ((2, 2)),
PARTITION P_1_3 VALUES IN ((2, 2)),
);
Gibt es etwas falsch mit, wie ich den KEY Partitionierung machte, so dass es nur die Hälfte der Partitionen schlagen endete?
Aber funktioniert es tatsächlich so? Wenn ich Ihre Partitionen richtig verstanden habe, müssen Sie tatsächlich mehrere Partitionen lesen, in denen Sie nach dem Ländercode suchen (weil Tabellen zuerst durch TYPE_OF_FOOD, SUBTYPE_OF_FOOD partitioniert werden). – e4c5
ja, es tut mir leid, ich habe das Problem vereinfacht und gezoomt. Alle meine Abfragen werden zuerst nach TYPE_OF_FOOD und SUBTYPE_OF_FOOD gefiltert (dies ist implizit und der Frontend-Benutzer wird nicht einmal wählen können). Und dann gibt es eine Wahl nach COUNTRY_CODE zu filtern, die ich für die meisten meiner Verwendung normalerweise mache. Ich habe die (primäre) Partitionierung nicht näher ausgeführt, weil ich beobachtet habe, dass es gut funktioniert (d. H. Daten gehen in die richtige Partition). –
nur ein Gedanke, ich bin mir nicht sicher, wie MySQL das Hashing tut, und nicht sicher, ob es relevant ist ... aber beeinflusst "lexikalische Nähe", ob zwei Werte in die gleiche Partition gehashed werden? (z. B. Schweiz (CHE) und China (CHN) und Australien (AUS) und Österreich (AUT)), und gibt es überhaupt eine Möglichkeit zu sehen, welche Zeilen in welchen Partitionen liegen? –