垂直分表和水平分表

在这里插入图片描述

  1. 水平分表

(1) 什么是水平分表
水平分表就是指以行为单位对数据进行拆分,一般意义上的分库分表指的就是水平分表。
分表之后,所有表的结构都是一样的。

(2) 为什么要水平分表
水平分表可以解决表中的数据量大的问题,如果一张表的数据太多,操作起来会很麻烦,所以分表存储数据。

(3) 如何进行水平分表
一般可以有范围法和hash法来进行水平分表。
假设现在有30万行数据,需要对它们进行水平分表:
范围法很好理解,可以让第1-100000行数据存放在表1,第100001-200000行数据存放在表2,第200001-300000行数据存放在表3,就完成了水平分表。
hash法也不难理解,就是选择一个合适的hash函数,比如说使用取模操作(%),把%3结果为0的数据存放在表1,结果为1的存放在表2,结果为2的存放在表3即可。

  1. 垂直分表

(1) 什么是垂直分表
垂直分表就是把一张表按列分为多张表,多张表通过主键进行关联,从而组成完整的数据。
分表之后,每张表的结构都不相同。
(2) 为什么要垂直分表
这主要跟某些数据库的引擎有关,比如Mysql的InnoDB引擎。

在Mysql中,数据的基本单位,称为行 (Row)
管理数据的基本单位,称为页 (Page)
保存页的单位,称为区 (Extent)
————————————————
版权声明:本文为优快云博主「ZhouJiachang-」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:作者博客

### MySQL 数据库水平分表垂直分表方法及其应用场景 #### 水平分表 (Sharding) 水平分表是指将同一张的数据按照一定的规则拆分成多份,每一份数据存储在一个独立的子中。这种方式适用于当单个的数据量非常庞大时。 - **实现方式** - 使用哈希算法或范围分区来决定哪些记录应该存放在哪个子内。 - 可以通过特定字段(如用户ID)作为键来进行散列计算,从而分配至不同格。 ```sql CREATE TABLE orders_shard_0 ( order_id INT NOT NULL, user_id INT NOT NULL, product_name VARCHAR(255), PRIMARY KEY(order_id) ); CREATE TABLE orders_shard_1 LIKE orders_shard_0; ``` - **优点** - 减少了单一内的数据总量,提高了查询效率[^4]。 - 支持更大的并发读写操作,因为各个分片可以分布在不同的机器上运行。 - **缺点** - 跨分片的操作变得复杂,特别是涉及到跨分片连接查询的情况。 - 维护成本增加,包括备份恢复、迁移等方面的工作难度加大。 - **适用场景** - 当某类实体的数量极其巨大,并且存在明显的地域分布或其他可利用特征用于切分时适合采用此策略。 #### 垂直分表 (Vertical Partitioning) 垂直分表则是指对于某些具有大量字段的大宽而言,将其划分为若干个小窄的过程。这通常是为了优化频繁使用的少量核心字段与其他较少访问的辅助属性之间的关系而设计的一种模式。 - **实现方式** - 将原中最常被一起检索出来的几个重要字段保留下来形成基础; - 把其他不太常用或者占用空间较大(例如BLOB类型)的字段单独提取出来创建新的关联。 ```sql -- 主要信息保存在基本信息里 CREATE TABLE customer_basic_info( id BIGINT AUTO_INCREMENT, name VARCHAR(64), age TINYINT UNSIGNED, gender ENUM('male', 'female'), PRIMARY KEY(id) ); -- 较少使用的额外资料则放置于扩展之中 CREATE TABLE customer_extra_details( cust_id BIGINT, address TEXT, profile_pic MEDIUMBLOB, -- 大型二进制对象 FOREIGN KEY(cust_id) REFERENCES customer_basic_info(id) ); ``` - **优点** - 提升了对热点数据项的快速定位能力,减少了不必要的I/O开销[^3]。 - 对于那些包含有大尺寸文本或多媒体内容的应用来说尤其有效果显著。 - **缺点** - 如果处理不当可能会导致过多的小规模JOIN操作影响整体性能现。 - 设计初期需要充分考虑未来可能的变化趋势以免后期调整困难。 - **适用场景** - 结构中含有许多低频率使用却占据较多磁盘空间的列时推荐实施该方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我先来一碗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值