拆分鍵即分庫/分表字段,是在水平拆分過程中用於生成拆分規則的資料表字段。drds 根據拆分鍵的值將資料表水平拆分到每個 rds 例項上的物理分庫中。
資料表拆分的首要原則,就是要盡可能找到資料表中的資料在業務邏輯上的主體,並確定大部分(或核心的)資料庫操作都是圍繞這個主體的資料進行,然後可使用該主體對應的字段作為拆分鍵,進行分庫分表。
業務邏輯上的主體,通常與業務的應用場景相關,下面的一些典型應用場景都有明確的業務邏輯主體,可用於拆分鍵:
以此類推,其它型別的應用場景,大多也能找到合適的業務邏輯主體作為拆分鍵的選擇。
例如,某面向賣家的電商應用,需要對下面的一張單錶進行水平拆分:
create
table sample_order (
idint(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 (
idint(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)
如果確實找不到合適的業務邏輯主體作為拆分鍵,那麼可以考慮下面的方法來選擇拆分鍵:
例如,某日誌系統記錄使用者的所有操作,需要對下面的日誌單錶進行水平拆分:
create table user_log (
userid int(11) not
null,
name varchar(64) not
null,
operation varchar(128)default
null,
actiondate datedefault
null
)
可以選擇使用者標識與時間字段相結合作為拆分鍵,並按照一周七天進行分表,則分布式 ddl 建表語句為:
create table user_log (
userid int(11) not
null,
name varchar(64) not
null,
operation varchar(128)default
null,
actiondate datedefault
null
) dbpartition by hash(userid) tbpartition by week(actiondate) tbpartitions 7
更多拆分鍵的選擇和分表形式,請參考 drds ddl 語句。
注意:無論選擇什麼拆分鍵,採用何種拆分策略,都要注意拆分值是否存在熱點的問題,盡量規避熱點資料來選擇拆分鍵。
相關文件
相關產品
主鍵的選擇 和 如何減少多外來鍵
這個靈感 於多日問題的集結 還是從例項開始 假定有以下模組 新聞模組 藝術家模組 藝術實體模組 書法 繪畫.那麼我們該怎麼設定這個外來鍵呢?我僅用過hibernate,就拿hibernate中的主鍵生成策略來說事把!而常用的有 foreign 不考慮,它主要用於多表共用乙個主鍵 native 根據底...
Scrum實踐 如何拆分Story
去年入職公司不久,就趕上了公司 敏捷 開發的改革大潮。從最初的敏捷培訓,到摸著路探索,也有4個月的時間了。現在,對於grooming,planning,daily stand up,demo review retrospective這些scrum中的活動已經清楚了很多。活動內容 grooming 梳...
如何從字典中隨機選擇乙個鍵
我是python的初學者。我嘗試使用這種方法 random.choice my dict.keys 但是有乙個錯誤 dict keys object does not support indexing我的字典很簡單,就像 my dict 你是如何解決這個問題的?非常感謝!要從名為的字典中選擇隨機金鑰...