Mysql
KEY 分區上有一半的分區是空的
我們正在嘗試將數據從目前具有超過 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。因此,它將更均勻地分佈在分區上。