MyCat2之分庫分表

原理

????????一個數據庫由很多表的構成,每個表對應的不同的業務,垂直切分是指按照業務將表進行分類,分不到不同的數據庫上,這樣壓力就分擔到了不同的庫上面。

數據分片

????????數據分片包括里:垂直分片和水平分片,垂直分片包括:垂直分庫和垂直分表,水平分片包括: 水平分庫和水平分表。

垂直分片

垂直分庫

????????數據庫中不同的表對應著不同的業務,垂直切分是指按照業務的不同將表進行分類,分布到不同的數據庫上面;

????????將數據庫部署在不同服務器上,從而達到多個服務器共同分攤壓力的效果

垂直分表

????????表中字段太多且包含大字段的時候,在查詢時對數據庫的IO、內存會受到影響,同時更新數據時,產生的binlog文件會很大,MySQL在主從同步時也會有延遲的風險。

????????將?個表按照字段分成多表,每個表存儲其中?部分字段。

????????對職位表進?垂直拆分, 將職位基本信息放在?張表, 將職位描述信息存放在另?張表

好處

  • 解決業務層面的耦合,業務清晰
  • 能對不同業務的數據進行分級管理、維護、監控、擴展等
  • 高并發場景下,垂直分庫?定程度的提高訪問性能
  • 垂直拆分沒有徹底解決單表數據量過大的問題

水平分片

水平分庫

????????將單張表的數據切分到多個服務器上去,每個服務器具有相應的庫表,只是表中數據集合不同。 水平分庫分表能夠有效的緩解單機和單庫的性能瓶頸和壓力,突破IO、連接數、硬件資源等的瓶頸。

水平分表

針對數據量巨大的單張表(比如訂單表),按照規則把?張表的數據切分到多張表里面去。 但是這些表還是在同?個庫中,所以庫級別的數據庫操作還是有IO瓶頸。

總結

垂直分表: 將?個表按照字段分成多表,每個表存儲其中?部分字段。
垂直分庫: 根據表的業務不同,分別存放在不同的庫中,這些庫分別部署在不同的服務器.
水平分庫: 把?張表的數據按照?定規則,分配到不同的數據庫,每?個庫只有這張表的部分數據.
水平分表: 把?張表的數據按照?定規則,分配到同?個數據庫的多張表中,每個表只有這個表的部分數據。

分庫分表

????????按照?定規則把數據庫中的表拆分為多個帶有數據庫實例,物理庫,物理表訪問路徑的分表。

實現

1.添加數據庫、存儲數據源

/*+ mycat:createDataSource{
"name":"dw0",

"url":"jdbc:mysql://192.168.140.100:3306", "user":"root",
"password":"123123"
} */;
/*+ mycat:createDataSource{
"name":"dr0", "url":"jdbc:mysql://192.168.140.100:3306", "user":"root",
"password":"123123"
} */;
/*+ mycat:createDataSource{ "name":"dw1", "url":"jdbc:mysql://192.168.140.99:3306", "user":"root",
"password":"123123"
} */;
/*+ mycat:createDataSource{ "name":"dr1", "url":"jdbc:mysql://192.168.140.99:3306", "user":"root",
"password":"123123"
} */;
#通過注釋命名添加數據源后,在對應目錄會生成相關配置文件 cd /usr/local/mycat/conf/datasources

如下圖:

2.添加集群配置

把新添加的數據源配置成集群

#//在 mycat 終端輸入
/*! mycat:createCluster{"name":"c0","masters":["dw0"],"replicas":["dr0"]} */;
/*! mycat:createCluster{"name":"c1","masters":["dw1"],"replicas":["dr1"]} */;
#可以查看集群配置信息
cd /usr/local/mycat/conf/clusters

如下圖:

3.創建全局表

#添加數據庫db1 CREATE DATABASE db1;
#在建表語句中加上關鍵字 BROADCAST(廣播,即為全局表) CREATE TABLE db1.`travelrecord` (

`id` bigint NOT NULL AUTO_INCREMENT, `user_id` varchar(100) DEFAULT NULL, `traveldate` date DEFAULT NULL, `fee` decimal(10,0) DEFAULT NULL, `days` int DEFAULT NULL,
`blob` longblob,
PRIMARY KEY (`id`),
KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 BROADCAST; #進入相關目錄查看 schema 配置
vim /usr/local/mycat/conf/schemas/db1.schema.json #可以看到自動生成的全局表配置信息

4.創建分片表(分庫分表)

#在 Mycat 終端直接運行建表語句進行數據分片 CREATE TABLE db1.orders(
id BIGINT NOT NULL AUTO_INCREMENT, order_type INT,

customer_id INT,
amount DECIMAL(10,2),
PRIMARY KEY(id),
KEY `id` (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
dbpartition BY mod_hash(customer_id) tbpartition BY mod_hash(customer_id) tbpartitions 1 dbpartitions 2;
#數據庫分片規則,表分片規則,以及各分多少片
INSERT INTO orders(id,order_type,customer_id,amount)
VALUES(1,101,100,100100);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(2,101,100,100300);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(3,101,101,120000);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(4,101,101,103000);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(5,102,101,100400);
INSERT INTO orders(id,order_type,customer_id,amount) VALUES(6,102,100,100020);
SELECT * FROM orders;
#同樣可以查看生成的配置信息
#進入相關目錄查看 schema 配置
vim /usr/local/mycat/conf/schemas/db1.schema.json

5.創建ER表

?

上述兩表具有相同的分片算法,但是分片字段不相同 Mycat2 在涉及這兩個表的 join 分片字段等價關系的時候可以完成 join 的下推

常用分片規則

MOD_HASH

如果分片值是字符串則先對字符串進行hash轉換為數值類型

分庫鍵和分表鍵是同鍵

分表下標=分片值%(分庫數量*分表數量)

分庫下標=分表下標/分表數量

分庫鍵和分表鍵是不同鍵

分表下標= 分表分片值%分表數量

分庫下標= 分庫分片值%分庫數量

create table travelrecord (
?....
) ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition by MOD_HASH (id) dbpartitions 6
tbpartition by MOD_HASH (id) tbpartitions 6;create table travelrecord (
?....
) ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition by MOD_HASH (id) dbpartitions 6
tbpartition by MOD_HASH (id) tbpartitions 6;

RANGE_HASH

RANGE_HASH(字段1, 字段2, 截取開始下標)

僅支持數值類型,字符串類型

當時字符串類型時候,第三個參數生效

計算時候優先選擇第一個字段,找不到選擇第二個字段

如果是字符串則根據下標截取其后部分字符串,然后該字符串hash成數值

根據數值按分片數取余

要求截取下標不能少于實際值的長度

兩個字段的數值類型要求一致

create table travelrecord(
...
)ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition by RANGE_HASH(id,user_id,3) dbpartitions 3
tbpartition by RANGE_HASH(id,user_id,3) tbpartitions 3;

RIGHT_SHIFT

RIGHT_SHIFT(字段名,位移數)

僅支持數值類型

分片值右移二進制位數,然后按分片數量取余

create table travelrecord(
?...
)ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition by RIGHT_SHIFT(id,4) dbpartitions 3
tbpartition by RIGHT_SHIFT(user_id,4) tbpartitions 3;

UNI_HASH

如果分片值是字符串則先對字符串進行hash轉換為數值類型

分庫鍵和分表鍵是同鍵

分庫下標=分片值%分庫數量

分表下標=(分片值%分庫數量)*分表數量+(分片值/分庫數量)%分表數量

分庫鍵和分表鍵是不同鍵

分表下標= 分片值%分表數量

分庫下標=分片值%分庫數量

create table travelrecord (
?....
) ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition by UNI_HASH (id) dbpartitions 6
tbpartition by UNI_HASH (id) tbpartitions 6;

WEEK

僅用于分表

僅DATE/DATETIME

一周之中的星期(1-7)進行取余運算

tbpartitions不超過7

create table travelrecord (
?....
) ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition by xxx(xx) dbpartitions 8
tbpartition by WEEK(xx) tbpartitions 7;

YYYYDD

僅用于分庫

DD是一年之中的天數

(YYYY*366+DD)%分庫數

create table travelrecord (
?....
) ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition by YYYYDD(xxx) dbpartitions 8
tbpartition by xxx(xxx) tbpartitions 12;

YYYYMM

僅用于分庫:(YYYY*12+MM)%分庫數.MM是1-12

create table travelrecord (
?....
) ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition by YYYYMM(xxx) dbpartitions 8
tbpartition by xxx(xx) tbpartitions 12;

??? "travelrecord":{
?? ??? ??? ?"createTableSQL":"CREATE TABLE db1.travelrecord (\n\t`id` bigint(22) NOT NULL\n) ENGINE = InnoDB CHARSET = utf8\nDBPARTITION BY YYYYMM(id) DBPARTITIONS 12",
?? ??? ??? ?"function":{
?? ??? ??? ??? ?"properties":{
?? ??? ??? ??? ??? ?"dbNum":"36",
?? ??? ??? ??? ??? ?"mappingFormat":"prototype/db1/travelrecord_${ 2022+(index.toInteger()-1).intdiv(12) }_${? if(index.toInteger()==0)return 'any';? var i=? (index.toInteger()).mod(12);? if(i==0)return '12'; return i; }",

?? ??? ??? ??? ??? ?"storeNum":1,
?? ??? ??? ??? ??? ?"dbMethod":"YYYYMM(id)"
?? ??? ??? ??? ?}
?? ??? ??? ?},
?? ??? ??? ?"shardingIndexTables":{}
?? ??? ?}

DD

僅用于分表

僅DATE/DATETIME

一月中的第幾天(1-31)%分表數

tbpartitions不能超過31

create table travelrecord (
?....
) ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition by xxx(xx) dbpartitions 8
tbpartition by DD(xx) tbpartitions 31;

YYYYWEEK

支持分庫分表

(YYYY*54+WEEK)%分片數

WEEK的范圍是1-53

java.time.temporal.WeekFields#weekOfWeekBasedYear

create table travelrecord (
?....
) ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition by YYYYWEEK(xx) dbpartitions 8
tbpartition by xxx(xx) tbpartitions 12;

MM

僅用于分表

僅支持DATE/DATETIME

月份(1-12)%分表數

tbpartitions不超過12

create table travelrecord (
?....
) ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition by xxx(xxx) dbpartitions 12
tbpartition by MM(xxx) tbpartitions 12;

MMDD

僅用于分表

僅DATE/DATETIME

一年之中第幾天%分表數

tbpartitions不超過366

create table travelrecord (
?....
) ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition by xxx(xx) dbpartitions 8
tbpartition by MMDD(xx) tbpartitions 366;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/16807.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/16807.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/16807.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

安裝依賴報-gyp: No Xcode or CLT version detected!

錯誤 > node-gyp rebuild No receipt for com.apple.pkg.CLTools_Executables found at /. No receipt for com.apple.pkg.DeveloperToolsCLILeo found at /. No receipt for com.apple.pkg.DeveloperToolsCLI found at /. gyp: No Xcode or CLT version detected! gyp ERR!…

【Spark加速】加大hive表在HDFS存的分片文件大小

配置參數: spark.hadoop.hive.exec.orc.default.stripe.size78643200 spark.hadoop.orc.stripe.size78643200 spark.hadoopRDD.targetBytesInPartition78643200 spark.hadoop.hive.exec.dynamic.partition.modenonstrict spark.sql.sources.partitionOverwriteModed…

【wiki知識庫】02.wiki知識庫SpringBoot后端的準備

📝個人主頁:哈__ 期待您的關注 目錄 一、🔥今日目標 二、📂打開SpringBoot項目 2.1 導入所需依賴 2.2修改application.yml配置文件 2.3導入MybatisPlus逆向工程工具 2.4創建一個公用的返回值 2.5創建CopyUtil工具類 2.6創建…

科技與心理學的協同舞蹈

在探討盲人如何利用如“蝙蝠避障”這樣的輔助軟件融入日常生活的同時,我們不得不深入觸及盲人教育心理學的核心,這一領域致力于理解盲人在學習與成長過程中獨特的心理需求與挑戰,以及如何通過教育策略激發他們的潛能,促進全面發展…

前端Vue自定義頂部搜索框:實現熱門搜索與歷史搜索功能

前端Vue自定義頂部搜索框:實現熱門搜索與歷史搜索功能 摘要: 隨著前端開發復雜性的增加,組件化開發成為了提高效率和降低維護成本的有效手段。本文介紹了一個基于Vue的前端自定義頂部搜索框組件,該組件不僅具備基本的搜索功能&am…

powershell腳本批量拉取 git倉庫文件

# 定義基礎URL和數據庫列表 $BASE_URL "http://8.8.11.99:8999/yaya/" $DATABASES "common-service", "bi-system", "erp", "gateway", "pdm", "plm", "public-service", "scm"…

Micro SD封裝是什么?

我們了解客戶對于Micro SD封裝的疑問。在這篇文章中,我們將詳細解釋Micro SD封裝是什么,以及其在存儲領域的技術原理和應用情況,幫助客戶更好地理解這一技術。 1. Micro SD封裝的定義 Micro SD封裝是指一種特定尺寸的存儲芯片封裝方式&#x…

windows 11 23H2更新總是失敗解決過程

頻繁更新失敗的困擾 最近一個月以來 windows 11 系統 23H2 更新總是失敗,更新失敗會撤銷更改: 之后會自動重啟系統,但是重啟進不去系統,屏幕有背光但是不顯示任何內容。 這時候只能長按開機鍵強制關機。每次出現這種情況我都沒辦法遠程連接到…

大規模團隊的數據庫開發,如何用OceanBase工具快速建立企業級賬號體系

前言 為了讓數據庫開發的安全性與可靠性得以充分保障,數據庫開發工具的管控能力顯得尤為關鍵。構建一個健全的賬號體系,能夠協助開發團隊實現對數據庫開發工具的全方位管控,從而有效防范各類數據安全隱患,確保數據庫開發的順利進…

【Python】搭建pypi私倉

1. 下載依賴 pip install pypiserver # 命令安裝 pypiserver 庫 pip install passlib # passlib 包來讀取 Apache htpasswd 文件apt-get install -y apache2-utils2. 生成密碼 使用htpasswd庫在指定路徑/path/to/.pypipasswd生成密碼文件 htpasswd -c /path/to/.pypipasswd …

【開源】租房管理系統 JAVA+Vue+SpringBoot+MySQL

目錄 一、系統介紹 租客屋主模塊 房源信息模塊 租客評價模塊 房源訂單模塊 留言板模塊 二、系統截圖 三、核心代碼 一、系統介紹 基于Vue.js和SpringBoot的租房管理系統,分為管理后臺和用戶網頁端,可以給管理員、租客和屋主角色使用&#xff0c…

大模型應用之基于Langchain的測試用例生成

一 用例生成實踐效果 在組內的日常工作安排中,持續優化測試技術、提高測試效率始終是重點任務。近期,我們在探索實踐使用大模型生成測試用例,期望能夠借助其強大的自然語言處理能力,自動化地生成更全面和高質量的測試用例。 當前…

【cocos creator】進度條控制腳本,支持節點進度條,圖片進度條,進度條組件,和進度文字展示

進度條控制腳本,支持節點進度條,圖片進度條,進度條組件,和進度文字展示 const { ccclass, property, menu } cc._decorator;let text_type cc.Enum({"20%": 0,"1/5": 1,"差值": 2,"自定義…

Django結合Manager重寫create、update、delete方法

想要重寫create、update、delete方法我們先要了解一下其他的知識點 Manager 在Django中,Manager是一個非常核心的概念,它負責與數據庫交互,提供了訪問和管理模型實例(即數據庫中的記錄)的方式。每個Django模型類默認…

jupyter lab怎么使用cmd打開

我一般都是用vscode,或者pycharm的終端打開 但是我為了秉承程序員的素養(就是覺得命令行打開很帥) 我試著去直接用一樣的命令,但是不行,顯示不是內部命令之類的。 是因為沒有配置環境變量。 但是我突然發現&#x…

【計算機畢業設計】基于SSM++jsp的汽車客運站管理系統【源碼+lw+部署文檔】

目錄 第1章 緒論 1.1 課題背景 1.2 課題意義 1.3 研究內容 第2章 開發環境與技術 2.1 MYSQL數據庫 2.2 JSP技術 2.3 SSM框架 第3章 系統分析 3.1 可行性分析 3.1.1 技術可行性 3.1.2 經濟可行性 3.1.3 操作可行性 3.2 系統流程 3.2.1 操作流程 3.2.2 登錄流程 3.2.3 刪除信息流…

rpm與yum擴展、命令

目錄 系統安裝軟件方式 1、rpm方式 命令 yum方式 安裝 更新和升級 查找與顯示 刪除程序 清除緩存 僅下載 系統安裝軟件方式 1、rpm方式 優點:無需網絡安裝軟件 缺點:無法解決軟件依賴 命令 rpm -ivh 安裝 --nodeps忽略依賴關系 --force強…

希爾伯特 包絡證明 未出現模態混合現象 是啥?

希爾伯特變換在信號處理中常用于求信號的包絡,它是一種線性運算,能夠將實數信號轉換為其解析信號,即包含原信號及其希爾伯特變換的復數信號。解析信號的實部是原信號,虛部是原信號的希爾伯特變換。 包絡證明 在信號處理中&#…

TypeScript 學習筆記(五):異步編程與錯誤處理

1. 引言 在前幾篇學習筆記中,我們介紹了 TypeScript 的基礎知識、高級類型系統、模塊與命名空間以及裝飾器和高級編程技巧。本篇將重點探討 TypeScript 中的異步編程與錯誤處理,幫助你在實際項目中更好地處理異步操作和錯誤。 2. 異步編程 異步編程是現代 JavaScript 應用…

C語言預處理中#和##運算符是什么意思?

一、問題 有?認為,在C 語?中使?“#”運算符的就是預處理,是不是呢?“##”?是什么呢? 二、解答 在程序中,最為常?的是#define 宏定義指令,下?通過這個指令理解?下“#”的作?。編寫?個預處理指令&a…