將單個(gè)數(shù)據(jù)庫(kù)拆分,單個(gè)表拆分為多個(gè)表;根據(jù)指定字段值或者值的部分計(jì)算數(shù)據(jù)庫(kù)索引和表索引;
創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比黃山區(qū)網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式黃山區(qū)網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋黃山區(qū)地區(qū)。費(fèi)用合理售后完善,十余年實(shí)體公司更值得信賴。一個(gè)典型的數(shù)據(jù)分布(示例為一庫(kù)多表,選擇一庫(kù)單表還是一庫(kù)多表按業(yè)務(wù)實(shí)際情況):
這里按 2 庫(kù)2 表舉例,裝填臨界:4;
計(jì)算分庫(kù)索引公式:
一. 自然遞增id:
適合同類別倉(cāng)儲(chǔ)管理類業(yè)務(wù)場(chǎng)景(即貨物區(qū)分類別相同,如同一工廠生產(chǎn)的一種啤酒,來(lái)什么貨物存什么貨物);
1. 當(dāng)分庫(kù)表字段值 {fieldValue} 大于等于4時(shí),需要先對(duì)4取余,跳轉(zhuǎn) 2.,小于4時(shí) 跳轉(zhuǎn) 2.;
2. db_index = {fieldValue} / db_indices_count;
3. table_index = {fieldValue} % [一個(gè)物理庫(kù)內(nèi)分表總數(shù)];
二. 預(yù)先分配庫(kù)表索引編號(hào):
用戶注冊(cè)時(shí)就按照用戶的地區(qū)、性別、年齡、選擇的產(chǎn)品類型等信息決策出用戶的分庫(kù)、分表索引值(決策邏輯公式應(yīng)該要滿足足夠的分布性);
1. 直接按照用戶的分庫(kù)分表屬性值路由分庫(kù)、分表;
分庫(kù)分表數(shù)據(jù)裝填概況(依次插入id 1~16的數(shù)據(jù)分布情況):
id值
db_0 : {
user_0 4 8 12 16
user_1 1 5 9 13
}
db_1: {
user_0 2 6 10 14
user_1 3 7 11 15
}
找到分庫(kù)、分表索引后,再根據(jù)SQL的Command Type (如SELECT、UPDATE) 或者用戶強(qiáng)制指定情況來(lái)決定是走 master/slave Leader / Follower (政治正確統(tǒng)稱)庫(kù),
如果主、從有多個(gè)物理實(shí)例,則需要按照一定的規(guī)則(隨機(jī)或者RoundRobin之類)來(lái)挑選一個(gè)物理節(jié)點(diǎn)(host / port)連接;
其中:
1. 修改新增update、insert 必須使用主節(jié)點(diǎn)連接;
2. 查詢則需要判斷區(qū)分 普通 SELECT 還是 SELECT FOR UPDATE / SELET IN SHARE MODE 事務(wù)操作,普通SELECT在容忍主從延遲的業(yè)務(wù)場(chǎng)景下可以到從執(zhí)行,其他到主執(zhí)行;
3. 一個(gè)SQL執(zhí)行完畢之后可能要清除路由上下文;
4. 大多數(shù)web2.0 業(yè)務(wù)場(chǎng)景(如抖音用戶信息頁(yè))都需要按照user_id 值或值的部分來(lái)計(jì)算分庫(kù)、分表索引;