全部產品
Search
文件中心

PolarDB:如何選擇拆分鍵

更新時間:Jul 06, 2024

本文將介紹如何在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拆分函數概述