本文將介紹如何在PolarDB-X 1.0中選擇合適的拆分鍵。
背景信息
拆分鍵即分庫或分表字段,是水平拆分過程中用于生成拆分規(guī)則的數(shù)據(jù)表字段。PolarDB-X 1.0將拆分鍵值通過拆分函數(shù)計算得到一個計算結果,然后根據(jù)這個結果將數(shù)據(jù)分拆到私有定制RDS實例上。
數(shù)據(jù)表拆分的首要原則是盡可能找到數(shù)據(jù)所歸屬的業(yè)務邏輯實體,并確定大部分(或核心的)SQL操作或者具備一定并發(fā)的SQL都是圍繞這個實體進行,然后可使用該實體對應的字段作為拆分鍵。
示例
業(yè)務邏輯實體通常與應用場景相關,下面的一些典型應用場景都有明確的業(yè)務邏輯實體(以此類推,其它應用場景也能找到合適的業(yè)務邏輯實體),其標識型字段可用來做拆分鍵。
- 面向用戶的互聯(lián)網(wǎng)應用,圍繞用戶維度來做各種操作,那么業(yè)務邏輯實體就是用戶,可使用用戶ID作為拆分鍵。
- 側重于賣家的電商應用,圍繞賣家維度來做各種操作,那么業(yè)務邏輯實體就是賣家,可使用賣家ID作為拆分鍵。
- 游戲類在線應用,圍繞玩家維度來做各種操作,那么業(yè)務邏輯實體就是玩家,可使用玩家ID作為拆分鍵。
- 車聯(lián)網(wǎng)在線應用,圍繞車輛維度來做各種操作,那么業(yè)務邏輯實體就是車輛,可使用車輛ID作為拆分鍵。
- 稅務類在線應用,圍繞納稅人來進行前臺業(yè)務操作,那么業(yè)務邏輯實體就是納稅人,可使用納稅人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)
)
確定業(yè)務邏輯實體為賣家,那么選擇字段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)
如果確實找不到合適的業(yè)務邏輯實體作為拆分鍵,特別是傳統(tǒng)企業(yè)級應用,那么可以考慮以下方法來選擇拆分鍵。
- 根據(jù)數(shù)據(jù)分布和訪問的均衡度來考慮拆分鍵,盡量將數(shù)據(jù)表中的數(shù)據(jù)相對均勻地分布在不同分表中,PolarDB-X 1.0推出了全局強一致二級索引和Parallel Query能夠提高在此場景下SQL并發(fā)度并縮短響應時間。
- 按照數(shù)字(字符串)類型與時間類型字段相結合作為拆分鍵,進行分庫和分表,適用于日志檢索類的應用場景。
例如某日志系統(tǒng)記錄了用戶的所有操作,現(xiàn)需要對如下日志單表進行水平拆分:
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和拆分函數(shù)概述。