计算机系统应用教程网站

网站首页 > 技术文章 正文

TiDB学习笔记(九)TiDB 数据库表结构设计

btikc 2025-01-03 14:23:48 技术文章 30 ℃ 0 评论

一、TiDB支持的数据对象

TiDB不支持UDF、存储过程以及触发器



二、聚簇表和非聚簇表



1、聚簇表:key由 表编号_主键 组成


2、非聚簇表:系统自动生成rowid,key由 表编号_rowid 组成。


3、建表后支持添加或删除聚簇索引,不可以添加或删除聚簇索引,不支持聚簇索引和非聚簇索引的相互转换


4、对于非聚簇表,采用隐式自增的rowid,容易造成写入热点。增加SHARD_ROW_ID_BITS,配合使用pre_split_regions,从而实现表拆分到不同的region



三、分区表

1、Range分区:对于表的每个分区中包含的所有行,按分区表达式计算的值都落在给定的范围内。Range 必须是连续的,并且不能有重叠,通过使用 VALUES LESS THAN 进行定义。

2、List分区:对于表的每个分区中包含的所有行,按分区表达式计算的值属于给定的数据集合。每个分区定义的数据集合有任意个值,但不能有重复的值,

3、List COLUMNS 分区:是 List 分区的一种变体,可以将多个列用作分区键,并且可以将整数类型以外的数据类型的列用作分区列。

4、Hash分区:用于保证数据均匀地分散到一定数量的分区里面。在 Range 分区中你必须为每个分区指定值的范围;在 Hash 分区中,只需要指定分区的数量。




四、自增ID

1、AUTO_INCREMENT 隐式分配的原理:

(1)对于每一个自增列,都使用一个全局可见的键值对用于记录当前已分配的最大 ID。

(2)由于分布式环境下的节点通信存在一定开销,为了避免写请求放大的问题,每个 TiDB 节点在分配 ID 时,都申请一段 ID 作为缓存,用完之后再去取下一段,而不是每次分配都向存储节点申请。

(3)当前 预分配的ID段使用完毕,或TiDB重启,都会重新再次申请新的ID段。



2、目前在 TiDB 中使用 AUTO_INCREMENT 有以下限制:

(1)定义的列必须为主键或者索引的首列。

(2)只能定义在类型为整数、FLOAT 或 DOUBLE 的列上。

(3)不支持与列的默认值 DEFAULT 同时指定在同一列上。

(4)不支持使用 ALTER TABLE 来添加 AUTO_INCREMENT 属性。

(5)通过 session 变量 @@tidb_allow_remove_auto_inc 控制是否允许通过 ALTER TABLE MODIFY 或 ALTER TABLE CHANGE 来移除列的 AUTO_INCREMENT 属性,默认是不允许移除


3、AUTO_RANDOM 用于解决大批量写数据入 TiDB 时因含有整型自增主键列的表而产生的热点问题

适用与 聚簇表,自增主键

(1)该属性必须指定在整数类型的主键列上,否则会报错。

(2)当主键属性为 NONCLUSTERED 时,即使是整型主键列,也不支持使用 AUTO_RANDOM。

(3)不支持使用 ALTER TABLE 来修改 AUTO_RANDOM 属性,包括添加或移除该属性。

(4)不支持修改含有 AUTO_RANDOM 属性的主键列的列类型。

(5)不支持与 AUTO_INCREMENT 同时指定在同一列上。

(6)不支持与列的默认值 DEFAULT 同时指定在同一列上。

(7)插入数据时,不建议自行显式指定含有 AUTO_RANDOM 列的值。不恰当地显式赋值,可能会导致该表提前耗尽用于自动分配的数值。



五、设计建议

1、高兼容性schema


2、高性能schema

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表