DRDS通过数据分片的方式,将业务数据拆分到多个MySQL实例上进行分片存储。
逻辑库
用户创建逻辑库时,可以自行选择哪些MySQL存储该库及每个MySQL上存储几个分片。
逻辑表
DRDS支持全局表、分片表、单片表、库内分表、库内分桶等表类型,DRDS支持简单Hash、字符串哈希、范围哈希、枚举哈希等多种分片算法。用户创建逻辑表时,根据实际情况需求进行创建,创建时需要指定表类型、哪个字段作为分片键、分片算法。
- 全局表,表存储在所有MySQL上,每个MySQL都包含该表的全量数据。
- 分片表,表按分片的方式存储在MySQL上,每个MySQL存储该表的一部分数据。
- 单片表,表只存储在其中一个MySQL的一个分片上。
- 库内分表,表经过分片后,仍然很大,则可以对表再次进行拆分,选定另一个字段作为库内分表的分片键进行拆分存储。库内分表也属于分片表。
- 库内分桶,表经过分片后,仍然很大,对表进行再次拆分,不过拆分方式是按分桶的方式进行拆分,区别于库内分表需要选定另一个字段作为分片键,库内分桶不需要指定另一个字段,只要指定分桶数量。
分片建议
- 用户在进行数据分片之前,建议考虑事务、分布式JOIN等场景,尽量将事务边界范围缩小到单个MySQL分片上,尽量避免分布式JOIN、跨库JOIN。
- 建议同一个业务中心的表,按照同一个维度进行数据拆分,比如用户中心,都按照用户ID进行分片,这样使用的时候可以最大程度减少分布式事务、分布式JOIN的情况,降低系统负载。
- 全局表适合存储配置类数据(比如菜单、区域)类型的表,数据量不大,表变更极少。
- 分片表适合于超大表,建议千万级以上大表才使用分片表。
- 数据量小(少于千万级)的表,建议使用单片表即可。
- 使用DRDS时,建议所有SQL语句的查询条件都能携带分片键,这样可以达到最高的执行效率,避免SQL广播。