概述

本页概述了 TiDB 中的数据库模式。将从本页开始围绕 Bookshop 这个应用程序来对 TiDB 的设计数据库部分展开介绍。并使用此数据库做后续数据的写入、读取示例。

术语歧义

此处术语会有歧义,为消除歧义,在此作出数据库模式设计文档部分中的术语简要约定:

为避免和通用术语数据库 (Database) 混淆,因此将逻辑对象称为数据库 (Database),TiDB 仍使用原名称,并将 TiDB 的部署实例称为集群 (Cluster)

因为 TiDB 使用与 MySQL 兼容的语法,在此语法下,模式 (Schema) 仅代表通用术语定义,并无逻辑对象定义,可参考此官方文档。若你从其他拥有 Schema 逻辑对象的数据库(如:PostgreSQLOracleMicrosoft SQL Server 等)迁移而来,请注意此区别。

数据库 Database

TiDB 语境中的 Database 或者说数据库,可以认为是表和索引等对象的集合。

TiDB 集群包含一个名为 test 的数据库。但建议你自行创建数据库,而不是使用 test 数据库。

表 Table

TiDB 语境中的 Table 或者说表,从属于某个数据库

表包含数据。每行数据中的每个值都属于一个特定的。每列都只允许单一数据类型的数据值。列可添加约束来进一步限定。你还可以添加生成列(实验特性)用于计算。

索引 Index

索引是单个表中行的副本,按列或列集排序。TiDB 查询使用索引来更有效的查找表内的数据,同时可以给出特定列的值。每个索引都是从属于某个的。

索引有两种常见的类型,分别为:

  • Primary Key: 即主键索引,即标识在主键列上的索引。
  • Secondary Index: 即二级索引,即在非主键上标识的索引。

注意:

TiDB 中,关于 Primary Key 的默认定义与 MySQL 常用存储引擎 InnoDB 不一致。InnoDB 中,Primary Key 的语义为:唯一,不为空,且为聚簇索引

而在 TiDB 中,Primary Key 的定义为:唯一,不为空。但主键不保证为聚簇索引。而是由另一组关键字 CLUSTEREDNONCLUSTERED 额外控制 Primary Key 是否为聚簇索引,若不指定,则由系统变量 @@global.tidb_enable_clustered_index 影响,具体说明请看聚簇索引

专用索引

TiDB 支持一些特殊场景专用的索引,用以提高特定用例中的查询性能。有关这些专用索引的介绍,请参阅以下页面:

索引和约束 5.4 5.3 5.2 5.1 5.0 4.0
表达式索引 实验特性 实验特性 实验特性 实验特性 实验特性 实验特性
列式存储 (TiFlash) Y Y Y Y Y Y
RocksDB 引擎 Y Y Y Y Y Y
Titan 插件 Y Y Y Y Y Y
不可见索引 Y Y Y Y Y N
复合主键 Y Y Y Y Y Y
唯一约束 Y Y Y Y Y Y
整型主键上的聚簇索引 Y Y Y Y Y Y
复合或非整型主键上的聚簇索引 Y Y Y Y Y N

其他对象

TiDB 支持一些和同级的对象:

  • 视图: 视图是一张虚拟表,该虚拟表的结构由创建视图时的 SELECT 语句定义,TiDB 目前不支持物化视图。
  • 序列: 创建和存储顺序数据。
  • 临时表: 临时表是数据不持久化的表。

访问控制

TiDB 支持基于用户或角色的访问控制。你可以通过角色或直接指向用户,从而授予用户查看、修改或删除 数据对象和数据模式的权限

执行数据库模式更改

不推荐使用客户端的 Driver 或 ORM 来执行数据库模式的更改。以经验来看,作为最佳实践,建议使用 MySQL 客户端或使用任意你喜欢的 GUI 客户端来进行数据库模式的更改。本文档中,将在大多数场景下,使用 MySQL 客户端 传入 SQL 文件来执行数据库模式的更改。

对象大小限制

此处摘录一些常见的对象大小限制,详细使用限制请查阅此文档

标识符长度限制

对象 限制
数据库名称 64 字符
表名称 64 字符
列名称 64 字符
索引名称 64 字符
视图名称 64 字符
序列名称 64 字符

单个表内限制

对象 限制
列数 默认为 1017,最大可调至 4096
索引数 默认为 64,最大可调至 512
分区数 8192
单行大小 默认为 6MB,可通过 txn-entry-size-limit 配置项调整
单行内单列大小 6MB

字符串类型限制

对象 限制
CHAR 256 字符
BINARY 256 字节
VARBINARY 65535 字节
VARCHAR 16383 字符
TEXT 6MB
BLOB 6MB

行数

TiDB 可通过增加集群的节点数来支持任意数量的行,原理可阅读 TiDB 最佳实践