如何選擇拆分鍵

2021-08-20 22:00:42 字數 1844 閱讀 9855

拆分鍵即分庫/分表字段,是在水平拆分過程中用於生成拆分規則的資料表字段。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 你是如何解決這個問題的?非常感謝!要從名為的字典中選擇隨機金鑰...