mycat分庫分表原理分析

mycat分庫分表原理分析

mycat是一個開源的分布式數據庫系統,是一個實現了mysql協議的服務器,前端用戶可以把它看作是一個數據庫代理,用mysql客戶端工具和命令行訪問,而其后端可以用mysql原生協議與多個mysql服務器通信,也可以用jdbc協議與大多數主流數據庫服務器通信,其核心功能是分表分庫,即將一個大表水平分割為n個小表,存儲在后端mysql服務器里或者其他數據庫里。

Mycat可以實現 讀寫分離 分表分庫

主從復制是MySQL自帶的哈~

關于分片取模算法:? 根據id進行取模? 根據數據庫集群的數量(或者說是表數量,mycat里面一個表對應一個庫)

使用MyCat分表分庫原理分析

Mycat中的路由結果是通過分片字段和分片方法來確定的,如果查詢條件中有 id 字段的情況還好,查詢將會落到某個具體的分片。如果查詢沒有分片的字段,會向所有的db都會查詢一遍,讓后封裝結果級給客戶端。

修改/mycat/conf/log4j2.xml日志級別為debug

比如:

在查詢?

select?*?from?user_info

發送三個db請求

如果是查詢素有的情況下(不帶條件)

轉換成為:

select?*?from?db1.user_info select?*?from?db2.user_info select?*?from?db3.user_info

最后把結果集給mycat進行封裝 然后返回給客戶端?

?

如果加個where id = 1? 這樣帶條件的情況下? mycat會進行轉換 1%3=1? 在db2上!轉換成 select * from db2.user_info where id = 1 如果查詢的是分片的話,效率很高。發送一條就搞定

如果不是分片字段的話? 會發送三條哦!效率很低

比如 where name = ‘jack’ 會發送三條 根據條件去每個數據庫里面進行查詢 返回結果

?

tailf -200f mycat.log: 進行實時的查看

然后迅速的查詢? 一目了然

?

注意分頁查詢:

select?*?from?user_info?limit?0,2

到底是哪個數據分片的?

?往三個庫里面發三個select請求? 獲取三對 六條結果

?隨機抽取一對返回給客戶端

?如果加了排序的條件呢?

?select?*?from?user_info?order?by?id??limit?0,2???(相當于取出最大的兩條數據)

?先發送三個select 每個都是最大的兩條 然后返回給mycat? 進行綜合評選拿出最大的倆 返回給客戶端

??

?如果是??

?select?*?from?user_info???limit?0,3

?每次請求返回的都是在改變的 是隨機的!

?db1 取兩條 db2 和 db3隨機一條

?

? 版權聲明
THE END
喜歡就支持一下吧
點贊6 分享