Mysql

KEY 分區上有一半的分區是空的

  • March 1, 2021

我們正在嘗試將數據從目前具有超過 1B 行的表移動到分區表。但是當我們開始這樣做時,我們注意到一半的分區是空的,這是為什麼呢?表按具有 UUIDv4 值的列進行分區。

我們的表定義:

CREATE TABLE table1 (
 `col1` varchar(36) NOT NULL DEFAULT '',
 `col2` varchar(256) NOT NULL DEFAULT '',
 `col3` datetime NOT NULL DEFAULT NOW(),
 UNIQUE KEY `unq_col1_col2 (`col1`,`col2`),
 KEY `idx_col3` (`col3`)
)
ENGINE=InnoDB
PARTITION BY KEY(col1)
PARTITIONS 100;

INFORMATION_SCHEMA.PARTITIONS輸出:

PARTITION_NAME  TABLE_ROWS
p0  136532
p1  0
p2  339523
p3  0
p4  156955
p5  0
p6  305700
p7  0
p8  209548
p9  0
p10 329291
p11 0
p12 152995
p13 0
p14 388600
p15 0
p16 251903
p17 0
p18 364532
p19 0
p20 200799
p21 0
......
p89 0
p90 303628
p91 0
p92 215546
p93 0
p94 399165
p95 0
p96 210364
p97 0
p98 318675
p99 0

我們正在使用目前版本為 的 Google Cloud SQL (MySQL) 5.7.32-google-log

您有 100 個分區。因此,您的雜湊值模數 100 很可能都是偶數。

這是散列的一般風險。如果散列函式只產生具有這種模式的值,您可能會得到不平衡的分區。

解決此問題的一種方法是使用素數作為分區數。例如 101 是一個接近您想要的分區數的素數。

這很有幫助,因為如果雜湊值模數 100 產生了一個模式,則該模式將在每個 100 個值的視窗中偏移 1。因此,它將更均勻地分佈在分區上。

引用自:https://dba.stackexchange.com/questions/286206