欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報(bào)激活碼778899分享:java 數(shù)據(jù)庫分庫分表的介紹

柚子快報(bào)激活碼778899分享:java 數(shù)據(jù)庫分庫分表的介紹

http://yzkb.51969.com/

為什么要分庫分表

把存于一個(gè)庫的數(shù)據(jù)分散到多個(gè)庫中,把存于一個(gè)表的數(shù)據(jù)分散到多個(gè)表中。如果說讀寫分離是為了分散數(shù)據(jù)庫讀寫操作壓力,分庫分表就是為了分散存儲(chǔ)壓力,一般情況下,單表數(shù)據(jù)量到達(dá)千萬級別,就可以考慮分庫分表了。

分庫分表的原則:能不分就不分:優(yōu)先MySQL調(diào)優(yōu),能不分就不分。

分庫分表基本概念

分表

比如你單表都幾千萬數(shù)據(jù)了,單表數(shù)據(jù)量太大,會(huì)極大影響你的 sql執(zhí)行的性能,到了后面你的 sql 可能就跑的很慢了。一般來說單表到幾百萬的時(shí)候,性能就會(huì)相對差一些了,你就得分表了。

分表是啥意思?就是把一個(gè)表的數(shù)據(jù)放到多個(gè)表中,然后查詢的時(shí)候你就查一個(gè)表。比如按照用戶 id 來分表,將一個(gè)用戶的數(shù)據(jù)就放在一個(gè)表中。然后操作的時(shí)候你對一個(gè)用戶就操作那個(gè)表就好了。這樣可以控制每個(gè)表的數(shù)據(jù)量在可控的范圍內(nèi),比如每個(gè)表就固定在 200 萬以內(nèi)。

分庫

分庫是啥意思?就是你一個(gè)庫一般我們經(jīng)驗(yàn)而言,最多支撐到并發(fā) 2000,一定要擴(kuò)容了,而且一個(gè)健康的單庫并發(fā)值你最好保持在每秒 1000 左右,不要太大。那么你可以將一個(gè)庫的數(shù)據(jù)拆分到多個(gè)庫中,訪問的時(shí)候就訪問一個(gè)庫好了。

分庫分表實(shí)現(xiàn)

分庫分表旨在,通過將大表、或大數(shù)據(jù)庫的數(shù)據(jù),切分為多個(gè)較小的部分,從而提升性能。

分庫分表的方式

垂直切分

垂直分表:操作數(shù)據(jù)庫中的某張表,把這張表中的一部分字段數(shù)據(jù)保存到一張新表里面,再把另一部分字段放另一張表,如:我們電商項(xiàng)目中的member表和member_info表

垂直分庫:把單一數(shù)據(jù)庫按照業(yè)務(wù)劃分,(專庫專用)

水平切分

水平分庫:例如數(shù)據(jù)庫,數(shù)據(jù)量持續(xù)增加 數(shù)據(jù)量大的問題依然存在,這樣可以把一個(gè)數(shù)據(jù)庫拆分為多個(gè)相同的數(shù)據(jù)庫,來分擔(dān)數(shù)據(jù)量多的問題

?水平分表:單表數(shù)據(jù)量過大

分表字段(sharding_key)選擇

選擇最佳的分表字段是一個(gè)需要仔細(xì)考慮的問題。最佳的分表字段應(yīng)該是能夠讓數(shù)據(jù)分布均勻、頻繁查詢的字段以及不可變的字段。通過選擇最佳的分表字段,可以提高系統(tǒng)的性能和查詢效率

常用字段:

主鍵ID:頻繁查詢并且唯一,非常適合作分表字段。例如,在用戶表中,用戶ID作為分表字段是一個(gè)不錯(cuò)的選擇,因?yàn)橛脩鬒D是唯一的,而且在查詢用戶信息時(shí)經(jīng)常會(huì)用到。

時(shí)間字段:如果業(yè)務(wù)需要按時(shí)間范圍查詢數(shù)據(jù),那么選擇時(shí)間字段作為分表字段是合理的。例如,在日志表中,可以選擇時(shí)間戳字段作為分表字段,以便按天、按月或按年分割數(shù)據(jù),方便查詢和維護(hù)。

地理信息字段:如果業(yè)務(wù)需要按地區(qū)查詢數(shù)據(jù),那么選擇地理信息字段作為分表字段是合適的。例如,在訂單表中,可以選擇訂單地區(qū)字段作為分表字段,以便將訂單數(shù)據(jù)按地區(qū)進(jìn)行拆分,方便查詢和擴(kuò)展。

關(guān)聯(lián)字段:如果業(yè)務(wù)需要頻繁進(jìn)行關(guān)聯(lián)查詢,那么選擇訂單號等關(guān)聯(lián)字段作為分表字段。例如,在訂單表中,可以選擇訂單號作為分表字段,因?yàn)橛唵翁栁ㄒ磺野瑯I(yè)務(wù)信息,并且日常查詢、關(guān)聯(lián)查詢都是根據(jù)訂單號查詢的,很少根據(jù)id查詢,方便查詢和維護(hù)。

選擇分表字段的原則:

1. 數(shù)據(jù)分布均勻:最佳的分表字段應(yīng)該是能夠讓數(shù)據(jù)分布均勻的字段,這樣可以避免某個(gè)表的數(shù)據(jù)過多,導(dǎo)致查詢效率降低。在用戶表中,如果以地區(qū)作為分表字段,可能會(huì)導(dǎo)致某些地區(qū)的數(shù)據(jù)過多,而某些地區(qū)的數(shù)據(jù)過少。

2. 頻繁查詢的字段:盡量選擇查詢頻率最高的字段(例如主鍵id),然后根據(jù)表拆分方式選擇字段。在一個(gè)訂單表中,如果經(jīng)常需要根據(jù)用戶ID查詢訂單信息,那么以用戶ID作為分表字段是一個(gè)不錯(cuò)的選擇。

3. 不可變字段:最佳的分表字段還應(yīng)該是不可變的字段,這樣可以避免在數(shù)據(jù)遷移時(shí)出現(xiàn)問題。在一個(gè)商品表中,如果選擇以商品名稱作為分表字段,那么當(dāng)商品名稱發(fā)生變化時(shí),就需要將數(shù)據(jù)移動(dòng)到不同的表中,這樣會(huì)增加系統(tǒng)的復(fù)雜度。

ShardingSphere介紹

概覽 :: ShardingSphere (apache.org)

?????????ShardingSphere是一套開源的分布式數(shù)據(jù)庫中間件解決方案組成的生態(tài)圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(計(jì)劃中)這3款相互獨(dú)立的產(chǎn)品組成。 他們均提供標(biāo)準(zhǔn)化的數(shù)據(jù)分片、分布式事務(wù)和數(shù)據(jù)庫治理功能,可適用于如Java同構(gòu)、異構(gòu)語言、云原生等各種多樣化的應(yīng)用場景。

Sharding-JDBC是ShardingSphere的第一個(gè)產(chǎn)品,也是ShardingSphere的前身。 它定位為輕量級Java框架,在Java的JDBC層提供的額外服務(wù)。它使用客戶端直連數(shù)據(jù)庫,以jar包形式提供服務(wù),無需額外部署和依賴,可理解為增強(qiáng)版的JDBC驅(qū)動(dòng),完全兼容JDBC和各種ORM框架。

適用于任何基于JDBC的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。 支持任何第三方的數(shù)據(jù)庫連接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。 支持任意實(shí)現(xiàn)JDBC規(guī)范的數(shù)據(jù)庫。目前支持MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92標(biāo)準(zhǔn)的數(shù)據(jù)庫。

????????配置是整個(gè)Sharding-JDBC的核心,是Sharding-JDBC中唯一與應(yīng)用開發(fā)者打交道的模塊。配置模塊也是Sharding-JDBC的門戶,通過它可以快速清晰的理解Sharding-JDBC所提供的功能。Sharding-JDBC提供了4種配置方式,用于不同的使用場景。通過配置,應(yīng)用開發(fā)者可以靈活的使用分庫分表、讀寫分離以及分庫分表 + 讀寫分離共用。

java配置 yaml配置 springboot配置 spirng命名空間配置

????????分庫分表并不是由 ShardingSphere-JDBC 來做,它是用來負(fù)責(zé)操作已經(jīng)分完之后的 CRUD 操作。

????????分庫分表是由數(shù)據(jù)庫中間件來實(shí)現(xiàn)的。數(shù)據(jù)庫中間件是位于應(yīng)用程序和數(shù)據(jù)庫之間的一層軟件,它負(fù)責(zé)將數(shù)據(jù)庫的訪問請求進(jìn)行攔截和解析,然后將請求分發(fā)到不同的數(shù)據(jù)庫節(jié)點(diǎn)上進(jìn)行處理。中間件會(huì)根據(jù)事先定義的規(guī)則將數(shù)據(jù)進(jìn)行分片(分庫分表),將數(shù)據(jù)分散存儲(chǔ)在多個(gè)數(shù)據(jù)庫節(jié)點(diǎn)上,從而提高數(shù)據(jù)庫的擴(kuò)展性和性能。

????????常見的數(shù)據(jù)庫中間件有MySQL的MyCAT、阿里巴巴的TDDL、螞蟻金服的OceanBase等。這些中間件通過內(nèi)置的路由規(guī)則和分片算法,可以將數(shù)據(jù)的讀寫請求合理地路由到對應(yīng)的數(shù)據(jù)庫節(jié)點(diǎn)上,實(shí)現(xiàn)透明的分庫分表操作。

????????因此,分庫分表不是由ShardingSphere-JDBC這樣的JDBC框架來完成的,而是由專門的數(shù)據(jù)庫中間件來實(shí)現(xiàn)的。ShardingSphere-JDBC主要負(fù)責(zé)提供對分庫分表后的數(shù)據(jù)進(jìn)行操作的功能。

代碼實(shí)例:

創(chuàng)建兩個(gè)數(shù)據(jù)庫edu_db_1,edu_db_2,每個(gè)庫中創(chuàng)建兩張表course_1,course_2

CREATE TABLE `product1` (

`id` bigint NOT NULL,

`cname` varchar(50) NOT NULL,

`shelf_id` bigint NOT NULL,

`status` varchar(10) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

CREATE TABLE `product2` (

`id` bigint NOT NULL,

`cname` varchar(50) NOT NULL,

`shelf_id` bigint NOT NULL,

`status` varchar(10) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

導(dǎo)入相關(guān)依賴

1.分表不分庫

配置對應(yīng)實(shí)體類以及 Mapper

Spring Boot配置 :: ShardingSphere (apache.org)

# sharding-jdbc 水平分表策略

# 配置數(shù)據(jù)源,給數(shù)據(jù)源起別名

spring.shardingsphere.datasource.names=m1

# 一個(gè)實(shí)體類對應(yīng)兩張表,覆蓋

spring.main.allow-bean-definition-overriding=true

# 配置數(shù)據(jù)源的具體內(nèi)容,包含連接池,驅(qū)動(dòng),地址,用戶名,密碼

spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSource

spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driver

spring.shardingsphere.datasource.m1.url=jdbc:mysql://localhost:3306/product_db_1?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&tinyInt1isBit=false

spring.shardingsphere.datasource.m1.username=root

spring.shardingsphere.datasource.m1.password=123456

# 指定product表分布的情況,配置表在哪個(gè)數(shù)據(jù)庫里,表的名稱都是什么 m1.product_1,m1.product_2

spring.shardingsphere.sharding.tables.product.actual-data-nodes=m1.product$->{1..2}

# 指定 product 表里面主鍵 cid 的生成策略 SNOWFLAKE

#key-generator屬性配置了他的主鍵列以及主鍵生成策略。

#ShardingJDBC默認(rèn)提供了UUID和SNOWFLAKE兩種分布式主鍵生成策略。

#spring.shardingsphere.sharding.tables.product.key-generator.column=id

#spring.shardingsphere.sharding.tables.product.key-generator.type=SNOWFLAKE

# 配置分表策略 約定 cid 值偶數(shù)添加到 product 1表,如果 cid 是奇數(shù)添加到 product2表

spring.shardingsphere.sharding.tables.product.table-strategy.inline.sharding-column=id

spring.shardingsphere.sharding.tables.product.table-strategy.inline.algorithm-expression=product$->{id % 2 + 1}

# 打開 sql 輸出日志

spring.shardingsphere.props.sql.show=true

測試代碼運(yùn)行

@Test

public void addProduct() {

for (int i = 1; i < 50; i++) {

int randomInt = RandomUtil.randomInt(1, 100);

Product product = new Product();

product.setId(Long.valueOf(i));

product.setCname("小米su7");

product.setShelf_id(randomInt+1l);

product.setStatus("小米");

productMapper.insert(product);

}

}

@Test

public void select(){

QueryWrapper queryWrapper = new QueryWrapper();

List products = productMapper.selectList(queryWrapper);

System.out.println(products);

}

2.分庫分表

配置對應(yīng)實(shí)體類以及 Mapper

# sharding-jdbc 水平分庫分表策略

# 配置數(shù)據(jù)源,給數(shù)據(jù)源起別名

# 水平分庫需要配置多個(gè)數(shù)據(jù)庫

spring.shardingsphere.datasource.names=m1,m2

# 一個(gè)實(shí)體類對應(yīng)兩張表,覆蓋

spring.main.allow-bean-definition-overriding=true

# 配置第一個(gè)數(shù)據(jù)源的具體內(nèi)容,包含連接池,驅(qū)動(dòng),地址,用戶名,密碼

spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSource

spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driver

spring.shardingsphere.datasource.m1.url=jdbc:mysql://localhost:3306/product_db_1?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&tinyInt1isBit=false

spring.shardingsphere.datasource.m1.username=root

spring.shardingsphere.datasource.m1.password=123456

# 配置第二個(gè)數(shù)據(jù)源的具體內(nèi)容,包含連接池,驅(qū)動(dòng),地址,用戶名,密碼

spring.shardingsphere.datasource.m2.type=com.alibaba.druid.pool.DruidDataSource

spring.shardingsphere.datasource.m2.driver-class-name=com.mysql.cj.jdbc.Driver

spring.shardingsphere.datasource.m2.url=jdbc:mysql://localhost:3306/product_db_2?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&tinyInt1isBit=false

spring.shardingsphere.datasource.m2.username=root

spring.shardingsphere.datasource.m2.password=123456

# 指定數(shù)據(jù)庫分布的情況和數(shù)據(jù)表分布的情況

# m1 m2 product_1 product_2

spring.shardingsphere.sharding.tables.product.actual-data-nodes=m$->{1..2}.product$->{1..2}

# 指定 course 表里面主鍵 id 的生成策略 SNOWFLAKE

# 指定分庫策略 約定 shelf_id 值偶數(shù)添加到 m1 庫,如果 shelf_id 是奇數(shù)添加到 m2 庫

spring.shardingsphere.sharding.tables.product.database-strategy.inline.sharding-column=shelf_id

spring.shardingsphere.sharding.tables.product.database-strategy.inline.algorithm-expression=m$->{shelf_id % 2 + 1}

# 指定分表策略 約定 id 值偶數(shù)添加到 product_1 表,如果 id 是奇數(shù)添加到 product_2 表

spring.shardingsphere.sharding.tables.product.table-strategy.inline.sharding-column=id

spring.shardingsphere.sharding.tables.product.table-strategy.inline.algorithm-expression=product$->{id % 2 + 1}

# 打開 sql 輸出日志

spring.shardingsphere.props.sql.show=true

測試代碼運(yùn)行

@Test

public void addProduct() {

for (int i = 1; i < 50; i++) {

int randomInt = RandomUtil.randomInt(1, 100);

Product product = new Product();

product.setId(Long.valueOf(i));

product.setCname("小米su7");

product.setShelf_id(randomInt+1l);

product.setStatus("小米");

productMapper.insert(product);

}

}

@Test

public void select(){

QueryWrapper queryWrapper = new QueryWrapper();

List products = productMapper.selectList(queryWrapper);

System.out.println(products);

}

柚子快報(bào)激活碼778899分享:java 數(shù)據(jù)庫分庫分表的介紹

http://yzkb.51969.com/

相關(guān)鏈接

評論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。

轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/19569908.html

發(fā)布評論

您暫未設(shè)置收款碼

請?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問

文章目錄