在程序使用中,我們會發(fā)現(xiàn)有些業(yè)務(wù)表數(shù)據(jù)量越來越大见间,查詢效率越來越低淤井,已經(jīng)到了必須考慮分表的時候布疼。那么如何分表呢?以下是個人心得:
方案一庄吼、按照時間分表
? ? 按照時間分表很好理解缎除,比如按照天、周总寻、月、年作為分表依據(jù)梢为;優(yōu)點是分表規(guī)則簡單渐行,缺點是數(shù)據(jù)查詢條件必須帶上時間參數(shù)轰坊。
方案二、按照userId分表
? ? web項目中祟印,一般請求都能獲取token或session肴沫,間接可以獲取身份id(userId)。然后根據(jù)userId值設(shè)置自己的規(guī)則生成表蕴忆,再建一個userId(主鍵)和tableName關(guān)聯(lián)的數(shù)據(jù)表颤芬。新產(chǎn)生的業(yè)務(wù)數(shù)據(jù)就存入對應(yīng)的表,同時把以前的業(yè)務(wù)表數(shù)據(jù)遷移過來套鹅。查詢業(yè)務(wù)數(shù)據(jù)時先根據(jù)當(dāng)前身份查找對應(yīng)的tableName站蝠,然后再查詢對應(yīng)表數(shù)據(jù)。
????如何根據(jù)userId值設(shè)置規(guī)則生成表卓鹿,先附圖:
如果userId是整形菱魔,可取最后一位數(shù)或最后兩位數(shù)來分表,分表個數(shù)分別對應(yīng)10個和100個吟孙,這里需要根據(jù)實際情況選擇澜倦。
? ? 如果userId是UUID字符串,先定義一個全局?jǐn)?shù)組[0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f]杰妓,一共10+6=16個元素藻治。①若取最后一個字符分表,可以分16個表巷挥;②若取最后兩位或首尾兩位分表栋艳,可分16*16=256個表,或者兩個字符對應(yīng)的數(shù)組索引相加句各,可分30個表吸占。userId規(guī)則分表的優(yōu)點是不管后期規(guī)則是否變動,只要有身份和表名關(guān)聯(lián)都不影響凿宾。缺點是查詢所有人最近的業(yè)務(wù)數(shù)據(jù)比較麻煩矾屯,可以考慮建一個表,只存最近所有人的信息初厚,并定期刪除很久以前的數(shù)據(jù)件蚕。
方案三、按照用戶組織分表
按照公司产禾、部門排作、小組等信息分表,前提是確定個人所屬組織不會發(fā)生改變亚情。優(yōu)點和缺點和方案二基本相同妄痪。
(所有思路僅供參考)