本文档详细介绍TiDB数据库与表创建的基础知识,包括数据库设计、表设计、数据类型、创建方法等内容。风哥教程参考TiDB官方文档SQL语法相关内容,适合DBA和开发人员在日常使用TiDB时参考。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 数据库概念
数据库是存储和管理数据的集合,TiDB中的数据库概念与MySQL类似。
- 数据库:存储表的容器
- 模式:数据库的同义词,在TiDB中与数据库概念相同
- 命名空间:数据库作为表的命名空间,确保表名在数据库内唯一
- 兼容MySQL语法
- 支持多个数据库
- 每个数据库有独立的权限控制
1.2 表概念
表是数据库中存储数据的基本单位,由行和列组成。
- 表结构:由列定义组成,包括列名、数据类型、约束等
- 行:表中的一条记录
- 列:表中的一个字段
- 约束:对表中数据的限制,如主键、外键、唯一约束等
1.3 数据类型
TiDB支持多种数据类型,与MySQL兼容。
1.3.1 数值类型
– TINYINT: 1字节,范围 -128 到 127
– SMALLINT: 2字节,范围 -32768 到 32767
– MEDIUMINT: 3字节,范围 -8388608 到 8388607
– INT: 4字节,范围 -2147483648 到 2147483647
– BIGINT: 8字节,范围 -9223372036854775808 到 9223372036854775807
– FLOAT: 4字节,单精度浮点数
– DOUBLE: 8字节,双精度浮点数
– DECIMAL(M,D): 可变长度,精确小数
1.3.2 字符串类型
– CHAR(M): 固定长度字符串,最大长度255
– VARCHAR(M): 可变长度字符串,最大长度65535
– TEXT: 可变长度文本,最大长度65535
– MEDIUMTEXT: 可变长度文本,最大长度16777215
– LONGTEXT: 可变长度文本,最大长度4294967295
– BLOB: 二进制数据,最大长度65535
– MEDIUMBLOB: 二进制数据,最大长度16777215风哥提示:
– LONGBLOB: 二进制数据,最大长度4294967295
1.3.3 日期时间类型
– DATE: 日期,格式 YYYY-MM-DD
– TIME: 时间,格式 HH:MM:SS
– DATETIME: 日期时间,格式 YYYY-MM-DD HH:MM:SS
– TIMESTAMP: 时间戳,格式 YYYY-MM-DD HH:MM:SS
– YEAR: 年份,格式 YYYY
1.3.4 其他类型
– ENUM: 枚举类型
– SET: 集合类型
– JSON: JSON数据类型
– BIT: 位类型
Part02-生产环境规划与建议
2.1 数据库设计
2.1.1 数据库命名
– 使用小写字母
– 使用下划线分隔单词
– 长度不超过64个字符
– 避免使用保留字
– 示例:fgedudb, fgedu_erp, fgedu_crm
2.1.2 数据库规划
– 按业务模块划分数据库
– 考虑数据量和访问频率
– 规划备份策略
– 规划权限管理
– 考虑数据隔离需求
2.2 表设计
2.2.1 表结构设计
– 遵循第三范式
– 合理选择数据类型
– 为每个表设置主键
– 合理设置索引
– 考虑数据增长
2.2.2 表命名
– 使用小写字母
– 使用下划线分隔单词
– 长度不超过64个字符
– 避免使用保留字
– 示例:fgedu_users, fgedu_orders, fgedu_products
2.2.3 列命名
– 使用小写字母
– 使用下划线分隔单词
– 长度不超过64个字符
– 避免使用保留字
– 示例:id, name, created_at, updated_at
2.3 命名规范
## 1. 数据库命名
– 前缀:fgedu_
– 示例:fgedudb, fgedu_erp
## 2. 表命名
– 前缀:fgedu_
– 示例:fgedu_users, fgedu_orders
## 3. 列命名
– 主键:id
– 外键:[表名]_id
– 时间戳:created_at, updated_at
– 状态:status
学习交流加群风哥QQ113257174
## 4. 索引命名
– 主键索引:PRIMARY
– 唯一索引:uk_[列名]
– 普通索引:idx_[列名]
– 组合索引:idx_[列名1]_[列名2]
Part03-生产环境项目实施方案
3.1 数据库创建
3.1.1 创建数据库
## 1. 基本语法
CREATE DATABASE [IF NOT EXISTS] database_name
[CHARACTER SET charset_name]
[COLLATE collation_name];
## 2. 示例
CREATE DATABASE IF NOT EXISTS fgedudb
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
## 3. 查看数据库
SHOW DATABASES;
## 4. 选择数据库
USE fgedudb;
## 5. 删除数据库
DROP DATABASE IF EXISTS fgedudb;
3.1.2 数据库字符集
## 1. 常用字符集
– utf8mb4: 支持四字节Unicode字符,包括emoji
– utf8: 支持三字节Unicode字符
– latin1: 单字节字符集
## 2. 字符集设置
CREATE DATABASE fgedudb CHARACTER SET utf8mb4;
## 3. 查看字符集
SHOW CREATE DATABASE fgedudb;
## 4. 修改字符集
ALTER DATABASE fgedudb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
3.2 表创建
3.2.1 创建表
## 1. 基本语法
CREATE TABLE [IF NOT EXISTS] table_name (
column1 data_type [constraints],
column2 data_type [constraints],
…
[PRIMARY KEY (column1, …)],
[UNIQUE KEY (column1, …)],
[INDEX (column1, …)],
[FOREIGN KEY (column1) REFERENCES table2 (column2)]
) [ENGINE=InnoDB] [DEFAULT CHARSET=utf8mb4] [COLLATE=utf8mb4_general_ci];
## 2. 示例
CREATE TABLE IF NOT EXISTS fgedu_users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT DEFAULT 0,
email VARCHAR(100) UNIQUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
## 3. 查看表结构
DESCRIBE fgedu_users;
SHOW CREATE TABLE fgedu_users;
## 4. 删除表
DROP TABLE IF EXISTS fgedu_users;
3.2.2 表约束
## 1. 主键约束
CREATE TABLE fgedu_users (
id INT PRIMARY KEY,
…
);
## 2. 唯一约束
CREATE TABLE fgedu_users (
id INT PRIMARY KEY,
email VARCHAR(100) UNIQUE,
…
);
## 3. 非空约束
CREATE TABLE fgedu_users (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
…
);
## 4. 默认值约束
CREATE TABLE fgedu_users (
id INT PRIMARY KEY,
age INT DEFAULT 0,
…
);
## 5. 外键约束
CREATE TABLE fgedu_orders (
id INT PRIMARY KEY,
user_id INT,
FOREIGN KEY (user_id) REFERENCES fgedu_users (id) ON DELETE CASCADE ON UPDATE CASCADE,
…
);
3.3 索引创建
3.3.1 创建索引
## 1. 主键索引
CREATE TABLE fgedu_users (
id INT PRIMARY KEY,
…
);
## 2. 唯一索引
CREATE TABLE fgedu_users (
id INT PRIMARY KEY,
email VARCHAR(100) UNIQUE,
…
);
## 3. 普通索引
CREATE TABLE fgedu_users (
id INT PRIMARY KEY,
name VARCHAR(50),
INDEX idx_name (name),
…
);
## 4. 组合索引
CREATE TABLE fgedu_users (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
INDEX idx_name_age (name, age),
…
);
## 5. 全文索引
CREATE TABLE fgedu_articles (
id INT PRIMARY KEY,
content TEXT,
FULLTEXT INDEX idx_content (content),
…
);
3.3.2 修改索引
## 1. 添加索引
ALTER TABLE fgedu_users ADD INDEX idx_email (email);
ALTER TABLE fgedu_users ADD UNIQUE INDEX uk_email (email);
## 2. 删除索引
ALTER TABLE fgedu_users DROP INDEX idx_email;
## 3. 查看索引
SHOW INDEX FROM fgedu_users;
Part04-生产案例与实战讲解
4.1 数据库创建实战案例
## 1. 连接到TiDB
$ mysql -h 192.168.1.401 -P 4000 -u root -p
## 2. 创建数据库
mysql> CREATE DATABASE IF NOT EXISTS fgedudb
-> CHARACTER SET utf8mb4
-> COLLATE utf8mb4_general_ci;
## 3. 查看数据库
mysql> SHOW DATABASES;
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
| performance_schema |
| sys |
| fgedudb |
+——————–+
## 4. 选择数据库
mysql> USE fgedudb;
## 5. 查看数据库信息
mysql> SHOW CREATE DATABASE fgedudb;
+———-+———————————————————————————————————————————-+
| Database | Create Database |
+———-+———————————————————————————————————————————-+
| fgedudb | CREATE DATABASE `fgedudb` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */ /*!80016 DEFAULT ENCRYPTION=’N’ */ |
+———-+———————————————————————————————————————————-+
4.2 表创建实战案例
## 1. 创建用户表
mysql> CREATE TABLE IF NOT EXISTS fgedu_users (
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(50) NOT NULL,
-> age INT DEFAULT 0,
-> email VARCHAR(100) UNIQUE,
-> phone VARCHAR(20),
-> address VARCHAR(255),
-> created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
-> updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
## 2. 创建订单表
mysql> CREATE TABLE IF NOT EXISTS fgedu_orders (
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> user_id INT,
-> order_no VARCHAR(32) UNIQUE,
-> amount DECIMAL(10,2) NOT NULL,
-> status VARCHAR(20) DEFAULT ‘pending’,
-> created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
-> updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-> FOREIGN KEY (user_id) REFERENCES fgedu_users (id) ON DELETE CASCADE ON UPDATE CASCADE
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
## 3. 创建产品表
mysql> CREATE TABLE IF NOT EXISTS fgedu_products (
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(100) NOT NULL,
-> price DECIMAL(10,2) NOT NULL,
-> stock INT DEFAULT 0,
-> description TEXT,
-> created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
-> updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
## 4. 创建订单详情表
mysql> CREATE TABLE IF NOT EXISTS fgedu_order_items (
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> order_id INT,
-> product_id INT,
-> quantity INT NOT NULL,
-> price DECIMAL(10,2) NOT NULL,
-> created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
-> FOREIGN KEY (order_id) REFERENCES fgedu_orders (id) ON DELETE CASCADE ON UPDATE CASCADE,
-> FOREIGN KEY (product_id) REFERENCES fgedu_products (id) ON DELETE CASCADE ON UPDATE CASCADE
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
## 5. 查看表结构
mysql> DESCRIBE fgedu_users;
+————+————–+——+—–+——————-+———————————————–+
| Field | Type | Null | Key | Default | Extra |
+————+————–+——+—–+——————-+———————————————–+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(50) | NO | | NULL | |
| age | int | YES | | 0 | |
| email | varchar(100) | YES | UNI | NULL | |
| phone | varchar(20) | YES | | NULL | |
| address | varchar(255) | YES | | NULL | |
| created_at | datetime | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
| updated_at | datetime | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP |
+————+————–+——+—–+——————-+———————————————–+
4.3 表结构修改实战
## 1. 添加列
mysql> ALTER TABLE fgedu_users ADD COLUMN gender VARCHAR(10) DEFAULT ‘unknown’;
## 2. 修改列
mysql> ALTER TABLE fgedu_users MODIFY COLUMN age TINYINT DEFAULT 0;
## 3. 删除列
mysql> ALTER TABLE fgedu_users DROP COLUMN address;
## 4. 添加索引
mysql> ALTER TABLE fgedu_users ADD INDEX idx_name (name);
mysql> ALTER TABLE fgedu_orders ADD INDEX idx_user_id (user_id);
## 5. 修改表名
mysql> ALTER TABLE fgedu_products RENAME TO fgedu_goods;
## 6. 查看修改后的表结构
mysql> DESCRIBE fgedu_users;
+————+————–+——+—–+——————-+———————————————–+
| Field | Type | Null | Key | Default | Extra |
+————+————–+——+—–+——————-+———————————————–+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(50) | NO | MUL | NULL | |
| age | tinyint | YES | | 0 | |
| email | varchar(100) | YES | UNI | NULL | |
| phone | varchar(20) | YES | | NULL | |
| gender | varchar(10) | YES | | unknown | |
| created_at | datetime | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
| updated_at | datetime | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP |
+————+————–+——+—–+——————-+———————————————–+
## 7. 查看索引
mysql> SHOW INDEX FROM fgedu_users;
+————+————+———-+————–+————-+———–+————-+———-+——–+——+————+———+—————+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+————+————+———-+————–+————-+———–+————-+———-+——–+——+————+———+—————+
| fgedu_users | 0 | PRIMARY | 1 | id | A | 0 | NULL | NULL | | BTREE | | |
| fgedu_users | 0 | email | 1 | email | A | 0 | NULL | NULL | YES | BTREE | | |
| fgedu_users | 1 | idx_name | 1 | name | A | 0 | NULL | NULL | | BTREE | | |
+————+————+———-+————–+————-+———–+————-+———-+——–+——+————+———+—————+
Part05-风哥经验总结与分享
5.1 最佳实践
TiDB数据库与表创建的最佳实践:
- 数据库设计:按业务模块划分数据库,使用统一的命名规范
- 表设计:遵循第三范式,合理选择数据类型,为每个表设置主键
- 索引设计:根据查询需求创建索引,避免过多索引
- 约束使用:合理使用约束确保数据完整性
- 字符集:使用utf8mb4字符集,支持更广泛的字符
- 存储引擎:使用InnoDB存储引擎
- 权限管理:为不同用户设置适当的权限
5.2 性能优化技巧
## 1. 数据类型优化
– 使用最小的合适数据类型
– 避免使用TEXT和BLOB类型存储频繁查询的数据
– 使用DECIMAL存储精确小数
– 合理设置字段长度
## 2. 索引优化
– 为查询条件中的列创建索引
– 为排序和分组的列创建索引
– 避免在索引列上使用函数
– 合理使用组合索引
– 定期维护索引
## 3. 表结构优化
– 避免过多列
– 避免使用外键约束(考虑应用层实现)
– 合理使用分区表
– 考虑表的垂直拆分和水平拆分
## 4. 命名优化
– 使用有意义的表名和列名
– 遵循统一的命名规范
– 避免使用保留字
5.3 常见错误与解决
## 1. 数据类型选择错误
– 错误:使用INT存储小数值
– 解决:使用TINYINT或SMALLINT
## 2. 索引创建不当
– 错误:创建过多索引
– 解决:只创建必要的索引
## 3. 表结构设计不合理
– 错误:表列过多
– 解决:进行表的垂直拆分
## 4. 约束使用不当
– 错误:过度使用外键约束
– 解决:考虑在应用层实现约束
## 5. 命名不规范
– 错误:使用中文或特殊字符命名
– 解决:使用小写字母和下划线
## 6. 字符集设置错误
– 错误:使用latin1字符集
– 解决:使用utf8mb4字符集
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
