数据库分片和分区

数据库的数据量达到一定程度之后,为避免带来系统性能上的瓶颈。需要进行数据的处理,采用的手段是分区、分片、分库、分表。

1 分片 Distribution

分片是把数据库横向扩展(Scale Out)到多个物理节点上的一种有效的方式,每一个分区包含数据库的某一部分,称为一个片(segment)。其主要目的是为突破单节点数据库服务器的 I/O 能力限制,解决数据库扩展性问题。

  1. 垂直(纵向)拆分:是指按功能模块拆分,以解决表与表之间的io竞争。比如分为订单库、商品库、用户库…这种方式多个数据库之间的表结构不同。
  2. 水平(横向)拆分:将同一个表的数据进行分块保存到不同的数据库中,来解决单表中数据量增长出现的压力。

例如在分布式系统Greenplum中,创建表时需要指定分布键将数据平均分布到各个分片。选择分布键非常重要,选择错了会导致数据不唯一,更严重的是会造成SQL性能急剧下降。

有两种分布策略:

hash分布

Greenplum默认使用hash分布策略。该策略可选一个或者多个列作为分布键(distribution key,简称DK)。分布键做hash算法来确认数据存放到对应的segment上。相同分布键值会hash到相同的segment上。表上最好有唯一键或者主键,这样能保证数据均衡分不到各个segment上,若选择的分布列值分布不均匀,则可能导致数据倾斜。如果创建表时未提供DISTRIBUTED子句,则将PRIMARY KEY或表的第一个合格列用作分布键,若没有则退化为随机分布策略。

CREATE TABLE TEST(
    id INT, 
    data INT
)
distribute by id;

randomly分布

数据会被随机分不到segment上,相同记录可能会存放在不同的segment上。随机分布可以保证数据平均,但是Greenplum没有跨节点的唯一键约束数据,所以无法保证数据唯一。

CREATE TABLE TEST(
    id INT, 
    data INT
)
distribute by random;

分布键选择

分布键必须是约束列的左子集,且列的顺序正确
默认分布键策略

  • 存在hash分区
    • 如果不存在唯一性约束,可以直接使用hash分区的字段作为分布键字段
    • 如果存在唯一性约束,检查hash分区字段是否是唯一约束字段的左子集(不要求顺序),若是则截取唯一约束中的hash分区字段作为分布键,顺序和唯一约束保持一致。如下所示唯一约束字段为(“NAME”, “VALUE”, “CONTENT”),hash分区字段为 value、name,是唯一约束的左子集,则截取"NAME"、 "VALUE"作为分布键。
    CREATE TABLE "FOO"(
    	"NAME" VARCHAR(10), 
    	"VALUE" VARCHAR(10), 
    	"CONTENT" VARCHAR(10), 
    	UNIQUE("NAME", "VALUE", "CONTENT"))
    partition by hash(value, name)(partition par1, partition par2)
    
  • 不存在hash分区
    • 存在唯一键,使用唯一键字段作为分布键
    • 不存在唯一键,使用数据库定义的第一个字段作为分布键

2 分区 Partition

分区是通过 PARTITION BY子句完成的,它允许将一个大表划分为多个子表。分区与分片的根本区别在于:分片是将数据存储在不同的物理机器或数据库,而分区是在一个数据库内进行的划分。

对大表进行分区,可以提高查询性能并简化数据库的维护任务,例如将旧数据滚动移除出数据库。但是创建过多的分区可能会拖慢管理和维护的速度,例如清理,恢复segment,扩展集群,检查磁盘使用情况等等。

有如下几种分区类型:

2.1 range分区。

分区表达式的值位于一个给定的连续区间内。一般使用这种分区方式大都是对连续的值进行分区,常见的如:按年份,日期进行分区。

CREATE TABLE employees (
id INT NOT NULL,
first_name VARCHAR(30),
last_name VARCHAR(30),
store_id INT NOT NULL,
create_time DATE NOT NULL DEFAULT '9999-12-31',)
partition BY range(to_days(create_time))
	(PARTITION p201701 VALUES LESS THAN (TO_DAYS('2017-02-01')) ENGINE = InnoDB,
	 PARTITION p201702 VALUES LESS THAN (TO_DAYS('2017-03-01')) ENGINE = InnoDB,
	 PARTITION p2018 VALUES LESS THAN MAXVALUE ENGINE = InnoDB );

2.2 List分区

列值在一个离散值集合中的某个值来进行选择。
例如下面store_id在1,5,6,9,17这些值中时候会被分配到pNorth这个分区中

CREATE TABLE employees (
id INT NOT NULL,
first_name VARCHAR(30),
last_name VARCHAR(30),
store_id INT NOT NULL,
create_time DATE NOT NULL DEFAULT '9999-12-31',)
PARTITION BY LIST(store_id)
	PARTITION pNorth VALUES IN (1,5,6,9,17),
	PARTITION pEast VALUES IN (2,4,10,11,19,20),
	PARTITION pWest VALUES IN (3,12,13,14,18),
	PARTITION pCentral VALUES IN (7,8,15,16));

分区键的选择:如果同时存在唯一性约束(unique和primary)和分区键,则唯一性约束必须包含分区键的所有字段

2.3 Hash分区

对分区键应用一个散列函数,得出数据应该放在n个分区中的哪一个分区。hash分区支持两种散列函数(分区方式):取模算法(默认hash分区方式)和线性的2的幂的运算法则(liner hash 分区)。
如下所示为线性hash分区

CREATE TABLE employees (
id INT NOT NULL,
first_name VARCHAR(30),
last_name VARCHAR(30),
store_id INT NOT NULL,
create_time DATE NOT NULL DEFAULT '9999-12-31',
)
PARTITION BY LINEAR HASH(id)
PARTITIONS 5;

2.4 Key分区

Key分区和Hash分区相似,但hash分区只支持整数分区,key分区支持除了blob或text类型之外的其他数据类型分区。创建key分区表的时候,可以不指定分区键,默认会选择使用主键/唯一键作为分区键

CREATE TABLE employees (
id INT NOT NULL,
first_name VARCHAR(30),
last_name VARCHAR(30),
store_id INT NOT NULL,
email VARCHAR(30) NOT NULL,
create_time DATE NOT NULL DEFAULT '9999-12-31',
)
PARTITION BY LINEAR Key(email)
PARTITIONS 5;

** 分区与分表 **

分表是把一张表分成多个小表。分区只不过把存放数据的文件分成了许多小块,分区后的表逻辑上还是一张表。分表与分区的根本不同在于:分表是对存储的数据进行物理划分,而分区则是逻辑划分

  • 1
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: MySQL 数据库分片分区是两种不同的技术手段,用于优化数据库的性能和可伸缩性。 分片是将一个大的数据库分成多个小的数据库,每个小的数据库只存储一部分数据,以减轻单个数据库的负载。通常,分片是基于数据的某个属性进行划分,例如用户 ID 或者地理位置。这样,不同的数据将存储在不同的数据库中,从而提高了数据库的性能和可伸缩性。 分区是将一个大的数据库表分成多个小的数据表,每个小的数据表只存储一部分数据,以减轻单个数据表的负载。与分片不同的是,分区是在同一个数据库中进行的,而不是在多个数据库之间进行。分区可以基于数据的某个属性进行划分,例如日期或者地理位置。这样,不同的数据将存储在不同的数据表中,从而提高了数据库的性能和可伸缩性。 除了分片分区,MySQL 还使用缓存等技术手段来提高数据库的性能。MySQL 的缓存包括查询缓存和缓存索引。查询缓存是将查询结果缓存起来,以便下次查询相同的结果时可以直接从缓存中获取,而不必重新执行查询。缓存索引是将常用的索引缓存起来,以便下次查询相同的索引时可以直接从缓存中获取,而不必重新计算。这些缓存技术可以显著提高数据库的性能,特别是在处理大量数据时。 ### 回答2: 数据的分片分区以及缓存是MySQL数据库中常用的技术手段。 首先,分片(Sharding)指的是将数据库水平分割成多个片段,每个片段存储不同的数据。通过分片,可以将数据分布在多个物理节点上,提高并发处理能力和可扩展性。分片可以根据某种规则(如哈希、范围等)将数据分配到不同的片段中,从而避免单一数据库节点的性能瓶颈。 其次,分区(Partitioning)是将数据按照某种规则进行分区,将数据拆分成多个独立的部分。分区可以根据数据的某个特定属性(如日期、地区等)进行划分,以实现更高效的查询和管理。分区可以提高查询性能、减少索引大小和增强可用性。 另外,缓存(Caching)是一种常见的提升数据库性能的技术手段。通过将经常访问的数据缓存在内存中,可以减少对磁盘的IO操作,加快数据的读写速度。MySQL中使用了多级缓存机制,包括查询缓存、InnoDB Buffer Pool等。查询缓存将查询结果缓存在内存中,提高重复查询的性能;InnoDB Buffer Pool则缓存磁盘上的数据页,减少磁盘IO,提高查询速度。 总结起来,分片分区是用于解决大规模数据存储和查询的技术手段,通过水平分割和垂直划分数据,提高数据库的并发处理能力和可扩展性。而缓存则是通过内存缓存常用数据,减少磁盘IO,提高查询性能。这些技术手段在MySQL数据库中广泛应用,帮助提升数据库的性能和可用性。 ### 回答3: MySQL数据库的数据分片是将一个数据库中的数据分成多个部分,分别存储在不同的服务器上。这种技术手段可以提高数据库的性能和扩展性。当数据库的数据量过大、负载过高或者需要增加存储容量时,可以将数据分散存储在多台服务器上,通过分片算法将请求分发到不同的服务器上进行处理,从而提高数据库的并发处理能力。 而数据库分区是将一个表的数据按照某个规则分隔为多个相互独立的部分,每个部分可以单独进行管理和查询。分区可以根据数据的特点,如时间范围、地理位置等进行划分,以提高查询的效率。同时,分区还可以提供数据的备份和恢复功能,当某个分区出现故障时,可以快速恢复数据。 数据库的缓存技术是通过将热点数据存储在内存中,提高数据的访问速度。MySQL数据库的缓存技术包括查询缓存和InnoDB的缓存。查询缓存是将查询语句及其结果存储在内存中,当有相同的查询请求时,直接返回缓存中的结果,避免了对数据库的重复查询。InnoDB的缓存是将数据库的数据和索引存储在内存中,通过减少磁盘访问,提高数据库的读写性能。 除了数据分片分区和缓存,MySQL数据库还有其他的技术手段用于提高性能和可用性,如索引优化、查询优化、主从复制等。这些技术手段可以根据具体的应用场景和需求进行选择和配置,以实现更高效的数据库操作。总之,通过合理使用这些技术手段,可以提升MySQL数据库的性能、可扩展性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值