1.分片Database Sharding
是一种 水平拆分(Horizontal Partitioning,按行拆分) 的方案,用来解决单机数据库在数据量、并发量上的瓶颈问题。(垂直拆分是指按列的字段拆分。)
一句话定义:
把同一张逻辑表的数据,按某种规则拆分,分布存储在多台数据库机器(或多个库/表)上。
-
对业务来说, 还是"一张表"
-
对物理存储来说: 实际是"多台机器上的多张表"
// 逻辑上一张表
user(id, name, age, ...)// 分片后,物理结构可能是:
db1.user_0 (存 user_id % 2 == 0 的数据)
db2.user_1 (存 user_id % 2 == 1 的数据)//从业务视角查询:
SELECT * FROM user WHERE id = 123;// 底层处理时
SELECT * FROM db2.user_1 WHERE id = 123;
1.1 缺点
- 跨分片查询。
- 自增主键不再可用。
2.分区
表分区 是数据库(如 MySQL、PostgreSQL)提供的一种单库内的物理拆分机制。
核心点:
-
对业务是 1 张表
-
对数据库也是 1 个库
-
对存储引擎来说是多份数据文件
👉 所有分区都在同一台数据库实例里。按时间分区的例子:
sql
CREATE TABLE orders (
id BIGINT NOT NULL,
create_time DATE NOT NULL,
amount INT,
PRIMARY KEY (id, create_time)
)
PARTITION BY RANGE (TO_DAYS(create_time)) (
PARTITION p202401 VALUES LESS THAN (TO_DAYS('2024-02-01')),
PARTITION p202402 VALUES LESS THAN (TO_DAYS('2024-03-01'))
);
已有数据的表新增分区,必须创建时已有分区才行:
sql
ALTER TABLE orders
ADD PARTITION (
PARTITION p202403 VALUES LESS THAN (TO_DAYS('2024-04-01'))
);