本文將介紹如何在PolarDB-X 1.0中選擇合適的拆分鍵。
背景資訊
拆分鍵即分庫或分表欄位,是水平分割過程中用於產生拆分規則的資料表欄位。PolarDB-X 1.0將拆分索引值通過拆分Function Compute得到一個計算結果,然後根據這個結果將資料分拆到RDS執行個體上。
資料表拆分的首要原則是儘可能找到資料所歸屬的商務邏輯實體,並確定大部分(或核心的)SQL操作或者具備一定並發的SQL都是圍繞這個實體進行,然後可使用該實體對應的欄位作為拆分鍵。
樣本
商務邏輯實體通常與應用情境相關,下面的一些典型應用情境都有明確的商務邏輯實體(以此類推,其它應用情境也能找到合適的商務邏輯實體),其標識型欄位可用來做拆分鍵。
說明 通常情況下,不建議將允許存在空值的列作為拆分鍵。
- 面向使用者的互連網應用,圍繞使用者維度來做各種操作,那麼商務邏輯實體就是使用者,可使用使用者ID作為拆分鍵。
- 側重於賣家的電商應用,圍繞賣家維度來做各種操作,那麼商務邏輯實體就是賣家,可使用賣家ID作為拆分鍵。
- 遊戲類線上應用,圍繞玩家維度來做各種操作,那麼商務邏輯實體就是玩家,可使用玩家ID作為拆分鍵。
- 車連網線上應用,圍繞車輛維度來做各種操作,那麼商務邏輯實體就是車輛,可使用車輛ID作為拆分鍵。
- 稅務類線上應用,圍繞納稅人來進行前台業務操作,那麼商務邏輯實體就是納稅人,可使用納稅人ID作為拆分鍵。
例如某面向賣家的電商應用,需要對如下單表進行水平分割:
CREATE TABLE sample_order (
id INT(11) NOT NULL,
sellerId INT(11) NOT NULL,
trade_id INT(11) NOT NULL,
buyer_id INT(11) NOT NULL,
buyer_nick VARCHAR(64) DEFAULT NULL,
PRIMARY KEY (id)
)確定商務邏輯實體為賣家,那麼選擇欄位sellerId作為拆分鍵,則您可以使用如下分布式DDL語句建表:
CREATE TABLE sample_order (
id INT(11) NOT NULL,
sellerId INT(11) NOT NULL,
trade_id INT(11) NOT NULL,
buyer_id INT(11) NOT NULL,
buyer_nick VARCHAR(64) DEFAULT NULL,
PRIMARY KEY (id)
) DBPARTITION BY HASH(sellerId)如果確實找不到合適的商務邏輯實體作為拆分鍵,特別是傳統企業級應用,那麼可以考慮以下方法來選擇拆分鍵。
- 根據資料分布和訪問的均衡度來考慮拆分鍵,盡量將資料表中的資料相對均勻地分布在不同分表中,PolarDB-X 1.0推出了全域強一致二級索引和Parallel Query能夠提高在此情境下SQL並發度並縮短回應時間。
- 按照數字(字串)類型與時間類型欄位相結合作為拆分鍵,進行分庫和分表,適用於日誌檢索類的應用情境。
例如某日誌系統記錄了使用者的所有操作,現需要對如下日誌單表進行水平分割:
CREATE TABLE user_log (
userId INT(11) NOT NULL,
name VARCHAR(64) NOT NULL,
operation VARCHAR(128) DEFAULT NULL,
actionDate DATE DEFAULT NULL
)此時可以選擇使用者標識與時間欄位相結合作為拆分鍵,並按照一周七天進行分表,則您可以使用如下分布式DDL語句建表:
CREATE TABLE user_log (
userId INT(11) NOT NULL,
name VARCHAR(64) NOT NULL,
operation VARCHAR(128) DEFAULT NULL,
actionDate DATE DEFAULT NULL
) DBPARTITION BY HASH(userId) TBPARTITION BY WEEK(actionDate) TBPARTITIONS 7更多拆分鍵的選擇和分表形式,請參見CREATE TABLE和拆分函數概述。