mysql分庫分表一般有如下場景
創(chuàng)新互聯(lián)公司服務項目包括營山網(wǎng)站建設、營山網(wǎng)站制作、營山網(wǎng)頁制作以及營山網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,營山網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到營山省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!
其中1,2相對較容易實現(xiàn),本文重點講講水平拆表和水平拆庫,以及基于mybatis插件方式實現(xiàn)水平拆分方案落地。
在 《聊一聊擴展字段設計》 一文中有講解到基于KV水平存儲擴展字段方案,這就是非常典型的可以水平分表的場景。主表和kv表是一對N關系,隨著主表數(shù)據(jù)量增長,KV表最大N倍線性增長。
這里我們以分KV表水平拆分為場景
對于kv擴展字段查詢,只會根據(jù)id + key 或者 id 為條件的方式查詢,所以這里我們可以按照id 分片即可
分512張表(實際場景具體分多少表還得根據(jù)字段增加的頻次而定)
分表后表名為kv_000 ~ kv_511
id % 512 = 1 .... 分到 kv_001,
id % 512 = 2 .... 分到 kv_002
依次類推!
水平分表相對比較容易,后面會講到基于mybatis插件實現(xiàn)方案
場景:以下我們基于博客文章表分庫場景來分析
目標:
表結(jié)構(gòu)如下(節(jié)選部分字段):
按照user_id sharding
假如分1024個庫,按照user_id % 1024 hash
user_id % 1024 = 1 分到db_001庫
user_id % 1024 = 2 分到db_002庫
依次類推
目前是2個節(jié)點,假如后期達到瓶頸,我們可以增加至4個節(jié)點
最多可以增加只1024個節(jié)點,性能線性增長
對于水平分表/分庫后,非shardingKey查詢首先得考慮到
基于mybatis分庫分表,一般常用的一種是基于spring AOP方式, 另外一種基于mybatis插件。其實兩種方式思路差不多。
為了比較直觀解決這個問題,我分別在Executor 和StatementHandler階段2個攔截器
實現(xiàn)動態(tài)數(shù)據(jù)源獲取接口
測試結(jié)果如下
由此可知,我們需要在Executor階段 切換數(shù)據(jù)源
對于分庫:
原始sql:
目標sql:
其中定義了三個注解
@useMaster 是否強制讀主
@shardingBy 分片標識
@DB 定義邏輯表名 庫名以及分片策略
1)編寫entity
Insert
select
以上順利實現(xiàn)mysql分庫,同樣的道理實現(xiàn)同時分庫分表也很容易實現(xiàn)。
此插件具體實現(xiàn)方案已開源:
目錄如下:
mysql分庫分表,首先得找到瓶頸在哪里(IO or CPU),是分庫還是分表,分多少?不能為了分庫分表而拆分。
原則上是盡量先垂直拆分 后 水平拆分。
以上基于mybatis插件分庫分表是一種實現(xiàn)思路,還有很多不完善的地方,
例如:
一句query來實現(xiàn),不可能
一次執(zhí)行一個的語句是
RENAME TABLE tb_name TO new_name;
老子教你一招.
用程序輸出一組語句然后在mysql執(zhí)行
例: php
我倒想把程序代碼都給你寫上,可不知道你mysql的數(shù)據(jù)結(jié)構(gòu),154651166 park412@hotmail.com
你加我
如果心情好可以幫你解決
select s.num1,t.num2 from
(select count(*) num1 from student) s,
(select count(*) num2 from teacher) t;
分別用兩個子查詢查出兩個標的記錄,即臨時表,然后列出來就可以。有問題再留言
根據(jù)業(yè)務邏輯,自己定一個規(guī)則去選擇不同的庫存儲。比方如計算機類書籍存儲A庫中的書籍表。經(jīng)濟類的書籍存儲B。最終構(gòu)造一個KEY(書籍類型)- value(庫標識)。查詢時根據(jù)庫標識取出對應的數(shù)據(jù)源進行查詢。
我寫了一下你看看吧
select t1.*,t2.*,t3.*(我不知道你要什么字段,所以就全部顯示了,也可以根據(jù)你的需要添加字段)
from a1 t1
, a2 t2
, a3 t3
where t1.user_id = t2.user_id(主鍵或外鍵:根據(jù)實際表的字段連接)
and t2.user_id = t3.user_id(主鍵或外鍵:根據(jù)實際表的字段連接)
and t1.name = '張三'
;
上面我只是舉個例子,如果你連表的字段信息都不知道,那我也沒有辦法,本人只會這些。