高并發(fā)主鍵設(shè)計(jì)選擇
索引:
-
聚簇索引
- 數(shù)據(jù)和索引存儲(chǔ)在一起的下面。 key和value一起存在一起复颈。
- 數(shù)據(jù)存儲(chǔ)在主鍵索引中。
- 數(shù)據(jù)按主鍵順序存儲(chǔ)沥割。
- 如何選擇主鍵:自增主鍵 和 隨機(jī)主鍵 UUID耗啦。對(duì)數(shù)據(jù)和存儲(chǔ)的影響來看。 自增主鍵:寫入性能高机杜。
- 自增主鍵優(yōu)點(diǎn):數(shù)據(jù)插入順序?yàn)樗饕龜?shù)據(jù)帜讲。寫入性能高。
- 隨機(jī)主鍵缺點(diǎn):插入不連續(xù)的主鍵導(dǎo)致page節(jié)點(diǎn)分裂椒拗。數(shù)據(jù)移動(dòng)似将。寫入性能相較于較低。
-
二級(jí)索引
- 除聚簇索引外的叫二級(jí)索引蚀苛。/ 除主鍵索引以外的玩郊。
- 葉子中存儲(chǔ)的的是主鍵值。 通過二級(jí)索引找到主鍵枉阵。通過主鍵回表到聚簇索引找到value译红。
- 一次查詢需要走兩遍索引。(性能衰減)
- 主鍵大小會(huì)影響所有索引文件的大小兴溜。(邏輯上影響查詢效率)
-
聯(lián)合索引
- 多個(gè)key組成的索引侦厚。
- 最左匹配原則。 (1.如果不是按照最左開始查詢拙徽,無法使用索引刨沦。 2.不能跳過中間列。 3.列表使用范圍查詢膘怕,后面的列不能使用索引想诅。)
- 一個(gè)索引只能創(chuàng)建一棵樹。
- 第一列排序岛心,第一列相同按第二列排序来破。
-
索引使用優(yōu)化分析
- 存儲(chǔ)空間
- 索引文件大小
- 字段大小->頁面節(jié)點(diǎn)個(gè)數(shù)->樹的層數(shù)
- 主鍵選擇
- 自增主鍵,順序?qū)懭胪牛矢吲墙#榱瞬槐┞缎畔⒉荒苡糜谥麈I查詢,所以每次查詢走二級(jí)索引髓堪。效率較慢)
- 隨機(jī)主鍵送朱,結(jié)點(diǎn)分裂娘荡、數(shù)據(jù)移動(dòng)。寫入磁盤利用率低驶沼,每次查詢走二級(jí)查詢炮沐;
- 業(yè)務(wù)主鍵:保證遞增且不連續(xù)的情況下。寫入回怜、查詢磁盤利用率都高大年,可以使用唯一索引。雪花算法(毫秒時(shí)間戳+分布式機(jī)器ID+計(jì)數(shù)器)
- 聯(lián)合主鍵:影響索引大小鹉戚,不易維護(hù),不建議使用专控。
- 聯(lián)合索引使用
- 按索引區(qū)分度排序抹凳。
- 覆蓋索引。 不回表伦腐,直接取到數(shù)據(jù)赢底。 數(shù)據(jù)和索引存放一起。
- 索引下推柏蘑。
- 字符串索引
- 設(shè)置合理長度幸冻。
- 不支持%開頭模糊查詢。
經(jīng)驗(yàn):
- 聯(lián)合索引:覆蓋索引由于多列獨(dú)立索引
- 索引順序:選擇性高的在前面
- 覆蓋索引:key里面包含要查詢的數(shù)據(jù)
- 索引排序:索引同時(shí)滿足查詢和排序
- 數(shù)據(jù)庫字符集使用utf8mb4咳焚;
- varchar:按照實(shí)際需要分配長度
- 文本字段建議使用varchar
- 時(shí)間字段建議使用long (時(shí)間戳)
- bool字段建議使用tinyint
- 枚舉字段建議使用tinyint
- 交易金額建議使用long 小數(shù)點(diǎn)前移乘以單位
- 禁止使用“%”前導(dǎo)的查詢
- 禁止在索引列進(jìn)行數(shù)據(jù)運(yùn)算洽损,會(huì)導(dǎo)致索引失效
- 表必須有主鍵建議使用業(yè)務(wù)主鍵
- 單表中索引數(shù)量不超過5個(gè)
- 單個(gè)索引字段數(shù)不超過5個(gè)
- 字符串索引使用前綴索引,前綴長度不超過10個(gè)字符
- 是否分表
- 看一單表不超過1kw
- 分表方式
- 取模:存儲(chǔ)均勻&訪問均勻
- 按時(shí)間:冷熱庫
- 分庫
- 按業(yè)務(wù)垂直分
- 水平拆分多個(gè)庫
- 存儲(chǔ)空間
分庫分表
- 垂直拆分
- 微服務(wù)拆分革半。(業(yè)務(wù)模塊拆碑定,分開庫)
- 垂直拆表。 將經(jīng)常寫入的列和經(jīng)常查詢的列拆開來又官。
- 水平拆分
- 取模 讀寫均勻
- 時(shí)間戳 按時(shí)間
- 冷熱庫 按時(shí)間
高并發(fā)場(chǎng)景分庫實(shí)踐落地方案
- 用戶庫的拆分:選查詢條件最高的那個(gè)延刘。
- uid(pk),phone(index)1.對(duì)uid取模六敬。2.對(duì)phone做索引map碘赖,回表查uid。
- 商品庫的拆分
- pid(pk)外构,uid(index)1.對(duì)商品pid做取模分表普泡。但是要根據(jù)uid查到發(fā)布的商品,需要做分組审编。解決方案:給用戶表生成一個(gè)字段
- uid 【TS + pubilc + NO + count】
- PID 【TS + NO + count + public】
- 使用public來進(jìn)行分表可以讓同一個(gè)用戶的商品分到一個(gè)表中
- 系統(tǒng)消息庫的拆分
- 時(shí)效性強(qiáng)劫哼。
- 冷熱數(shù)據(jù)拆分。 按月份分
- 如果少分了庫表怎么辦割笙?
合理利用主從同步权烧,然后修改業(yè)務(wù)路由眯亦,分片算法,清理舊數(shù)據(jù)般码。