我在MySQL 5.7上使用InnoDB引擎。MySQL - 使用密鑰分區時將數據分佈不均勻分區
我有一張表格,其中一列是一個(非唯一的)三字母國家代碼(例如,新加坡的「SGP」,日本的「JPN」等)。
對於大多數我的查詢,這個國家代碼列是第一WHERE子句我通過(例如
WHERE COUNTRY_CODE = 'SGP'
)濾波器因此,我想(子)分區表通過此列。由於我的大部分查詢都將使用一個國家/地區代碼,因此他們只會以這種方式觸及一個分區。
但是,由於大量不同的國家代碼,我不想使用LIST分區,我必須明確地滿足每個國家/地區的代碼。
所以我用KEY分區,8分區。我認爲密鑰分區(即哈希值)會給我一個或多或少的8個分區的均勻分配(不一定非常完美)。
但是,我所經歷的是,在8個分區中,其中4個是完全不變的。
這是我的CREATE TABLE語句的抽象:
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)),
);
這有什麼錯我是如何做的KEY分區,使得其結果只擊中分區的一半?
但它真的這樣工作嗎?如果我已經正確理解你的分區,你實際上需要閱讀多個分區,你可以通過國家代碼進行查詢(因爲表格首先被TYPE_OF_FOOD,SUBTYPE_OF_FOOD分區) – e4c5
是的,對不起,我簡化了並放大了問題。我的所有查詢都將首先按TYPE_OF_FOOD和SUBTYPE_OF_FOOD進行過濾(這是隱式的,前端用戶甚至不會選擇)。 然後,可以選擇按照COUNTRY_CODE進行過濾,對於我的大部分用途,我通常會這樣做。 我沒有詳細說明(主要)分區,因爲我觀察到運行良好(即數據進入正確的分區)。 –
只是一個想法,我不知道MySQL如何做散列,並且不確定它是否相關......但是「詞彙親密度」影響兩個值是否散列到同一分區? (例如瑞士(CHE)和中國(CHN),澳大利亞(AUS)和奧地利(AUT)),無論如何,有什麼辦法可以查看哪些行位於哪些分區? –