TiDB 数据库模式设计概述
本文档提供了 TiDB 数据库模式设计的基础知识,包括 TiDB 中的对象、访问控制、数据库模式变更以及对象限制。
在后续的文档中,Bookshop 将作为示例,向你展示如何设计数据库以及在数据库中进行数据读写操作。
TiDB 中的对象
为区分一些常用术语,以下是对 TiDB 中使用术语的简要说明:
-
为避免与通用术语 database 混淆,本文档中的 database 指的是逻辑对象,TiDB 指的是 TiDB 本身,cluster 指的是部署的 TiDB 实例。
-
TiDB 使用与 MySQL 兼容的语法,其中 schema 表示通用术语 schema,而不是数据库中的逻辑对象。更多信息请参见 MySQL 文档。如果你从具有逻辑对象 schema 的数据库迁移(例如 PostgreSQL、Oracle、Microsoft SQL Server),请务必注意这一差异。
Database
TiDB 中的 database 是一组对象的集合,例如表和索引。
TiDB 默认带有一个名为 test 的 database。然而,建议你创建自己的 database,而不是使用 test。
Table
Table 是在 database 中相关数据的集合。
每个 table 由 rows 和 columns 组成。每行中的每个值属于特定的 column。每个 column 只允许一种数据类型。为了进一步限定列,可以添加一些 constraints。为了加快计算速度,可以添加 generated columns。
Index
Index 是 table 中选定列的副本。你可以使用一个或多个列创建索引。通过索引,TiDB 可以快速定位数据,而不必每次都搜索 table 中的每一行,从而大大提高查询性能。
常见的索引类型有:
- Primary Key:在主键列上的索引。
- Secondary Index:在非主键列上的索引。
Note
在 TiDB 中,Primary Key 的默认定义与 InnoDB(MySQL 常用存储引擎)中的定义不同。
- 在 InnoDB 中,Primary Key 是唯一的、非空的,并且是 clustered index。
- 在 TiDB 中,Primary Key 是唯一的、非空的,但不保证是 clustered index。如果要指定主键是否为聚簇索引,可以在
CREATE TABLE语句中在PRIMARY KEY后添加非保留关键字CLUSTERED或NONCLUSTERED。如果语句未明确指定这些关键字,默认行为由系统变量@@global.tidb_enable_clustered_index控制。更多信息请参见 Clustered Indexes。
专用索引
为了提升各种用户场景下的查询性能,TiDB 提供了一些专用类型的索引。每种类型的详细信息,请参见 Indexing and constraints。
其他支持的逻辑对象
TiDB 支持以下与 table 同级的逻辑对象:
- View:视图作为虚拟表,其 schema 由创建视图的
SELECT语句定义。 - Sequence:序列用于生成和存储连续的数据。
- Temporary table:临时表,其数据不持久化。
访问控制
TiDB 支持基于用户和基于角色的访问控制。为了允许用户查看、修改或删除数据对象和数据 schema,你可以直接授予 privileges 给 users,或者通过 roles 授予 privileges。
数据库模式变更
作为最佳实践,建议你使用 MySQL 客户端 或图形界面客户端,而非驱动或 ORM 来执行数据库模式变更。
对象限制
更多信息请参见 TiDB Limitations。