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