水平分表
最近更新时间: 2025-02-18 16:02:00
概述
水平拆分方案,实际上是分布式数据库的基础原理,他的每个节点都参与计算和数据存储,且每个节点都仅计算和存储一部分数据。因此,无论业务的规模如何增长,我们仅需要在分布式集群中不断的添加设备,用新设备去应对增长的计算和存储需要即可。
水平切分
水平切分(分表):是按照某种规则,将一个表的数据分散到多个物理独立的数据库服务器中,形成“独立”的数据库“分片”。多个分片共同组成一个逻辑完整的数据库实例。
- 常规的单机数据库中,一张完整的表仅在一个物理存储设备上读写。
- 分布式数据库中,根据在建表时设定的分表键,系统将根据不同分表键自动分布到不同的物理分片中,但逻辑上仍然是一张完整的表。
- 在 TDSQL 中,数据的切分通常就需要找到一个分表键(shardkey)以确定拆分维度,再采用某个字段求模(HASH)的方案进行分表,而计算 HASH 的某个字段就是 shardkey。 HASH 算法能够基本保证数据相对均匀地分散在不同的物理设备中。
写入数据( SQL 语句含有 shardkey )
- 业务写入一行数据。
- 网关通过对 shardkey 进行 hash。
- 不同的 hash 值范围对应不同的分片(调度系统预先分片的算法决定)。
- 数据根据分片算法,将数据存入实际对应的分片中。
数据聚合
数据聚合:如果一个查询 SQL 语句的数据涉及到多个分表,此时 SQL 会被路由到多个分表执行,TDSQL 会将各个分表返回的数据按照原始 SQL 语义进行合并,并将最终结果返回给用户。
说明:
执行 SELECT 语句时,建议您在 where 条件带上 shardKey 字段,否则会导致数据需要全表扫描然后网关才对执行结果进行聚合。全表扫描响应较慢,对性能影响很大。
读取数据(有明确 shardkey 值)
- 业务发送 select 请求中含有 shardkey 时,网关通过对 shardkey 进行 hash。
- 不同的 hash 值范围对应不同的分片。
- 数据根据分片算法,将数据从对应的分片中取出。
读取数据(无明确 shardkey 值)
- 业务发送 select 请求没有 shardkey 时,将请求发往所有分片。
- 各个分片查询自身内容,发回 Proxy 。
- Proxy 根据 SQL 规则,对数据进行聚合,再答复给网关。