Files
lyzsys_backend/doc/数据库设计.md
2026-01-19 18:34:10 +08:00

698 lines
20 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Lyzsys 数据库设计文档
## 📖 目录
- [数据库概述](#数据库概述)
- [设计规范](#设计规范)
- [核心表设计](#核心表设计)
- [索引设计](#索引设计)
- [数据字典](#数据字典)
- [多租户设计](#多租户设计)
- [数据库优化](#数据库优化)
- [数据库管理](#数据库管理)
---
## 数据库概述
### 技术选型
| 特性 | 说明 |
|------|------|
| 数据库 | MySQL 5.7+ / 8.0+ |
| 字符集 | utf8mb4 |
| 排序规则 | utf8mb4_unicode_ci |
| 引擎 | InnoDB |
| 时区 | Asia/Shanghai |
### 支持的数据库
- MySQL 5.7、8.0+
- PostgreSQL 9.6+
| Oracle 11g+
| SQL Server 2012+
| H2 2.x (开发测试)
### 数据库特点
1. **多数据库支持**: 通过 MyBatis Plus 实现
2. **租户隔离**: 支持多租户数据隔离
3. **逻辑删除**: 支持软删除
4. **数据权限**: 支持行级数据权限
5. **审计日志**: 完整的创建、更新日志
---
## 设计规范
### 命名规范
#### 数据库命名
- 格式: `lyzsys`
- 示例: `lyzsys`
#### 表命名
- 格式: `{模块}_{业务}_{实体}`
- 规则: 小写字母 + 下划线
- 示例:
- `system_users` - 系统用户表
- `system_roles` - 系统角色表
- `mall_orders` - 商城订单表
- `bpm_process_instance` - 工作流实例表
#### 字段命名
- 格式: 小写字母 + 下划线
- 规则: 使用有意义的单词组合
- 示例:
- `user_id` - 用户 ID
- `user_name` - 用户名
- `create_time` - 创建时间
- `update_time` - 更新时间
#### 索引命名
- 主键索引: `PRIMARY`
- 唯一索引: `uniq_{字段名}`
- 普通索引: `idx_{字段名}`
- 示例:
- `uniq_username` - 用户名唯一索引
- `idx_dept_id` - 部门 ID 普通索引
### 字段类型
#### 整数类型
| 类型 | 字节 | 范围 | 用途 |
|------|------|------|------|
| TINYINT | 1 | -128 ~ 127 | 状态、标识 |
| SMALLINT | 2 | -32768 ~ 32767 | 枚举值 |
| INT | 4 | -21亿 ~ 21亿 | 数量、序号 |
| BIGINT | 8 | 极大数值 | 主键、外键 |
#### 字符串类型
| 类型 | 长度 | 用途 |
|------|------|------|
| CHAR | 0-255 | 固定长度字符串 |
| VARCHAR | 0-65535 | 变长字符串 |
| TEXT | 0-65535 | 长文本 |
| LONGTEXT | 0-4294967295 | 超长文本 |
#### 日期时间类型
| 类型 | 格式 | 用途 |
|------|------|------|
| DATE | YYYY-MM-DD | 日期 |
| DATETIME | YYYY-MM-DD HH:MM:SS | 日期时间 |
| TIMESTAMP | 时间戳 | 时间戳 |
#### 小数类型
| 类型 | 用途 |
|------|------|
| DECIMAL(M,D) | 金额、精度数值 |
### 通用字段
每张表都包含以下通用字段:
```sql
-- 主键
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键'
-- 创建信息
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
creator VARCHAR(64) COMMENT '创建人'
-- 更新信息
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
updater VARCHAR(64) COMMENT '更新人'
-- 删除标记
deleted BIT NOT NULL DEFAULT FALSE COMMENT '是否删除'
-- 租户 ID (多租户表)
tenant_id BIGINT NOT NULL COMMENT '租户 ID'
```
---
## 核心表设计
### 系统管理模块
#### 1. 用户表 (system_users)
```sql
CREATE TABLE `system_users` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`username` VARCHAR(30) NOT NULL COMMENT '用户账号',
`password` VARCHAR(100) NOT NULL COMMENT '密码',
`nickname` VARCHAR(30) NOT NULL COMMENT '用户昵称',
`remark` VARCHAR(500) COMMENT '备注',
`dept_id` BIGINT NOT NULL COMMENT '部门ID',
`post_ids` VARCHAR(255) COMMENT '岗位编号数组',
`email` VARCHAR(50) COMMENT '用户邮箱',
`mobile` VARCHAR(11) COMMENT '手机号码',
`sex` TINYINT COMMENT '用户性别',
`avatar` VARCHAR(100) COMMENT '头像地址',
`status` TINYINT NOT NULL DEFAULT 0 COMMENT '帐号状态0正常 1停用',
`login_ip` VARCHAR(50) COMMENT '最后登录IP',
`login_date` DATETIME COMMENT '最后登录时间',
`tenant_id` BIGINT NOT NULL COMMENT '租户 ID',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`creator` VARCHAR(64) COMMENT '创建人',
`updater` VARCHAR(64) COMMENT '更新人',
`deleted` BIT NOT NULL DEFAULT FALSE COMMENT '是否删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_username` (`username`, `update_time`, `tenant_id`, `deleted`)
) ENGINE=InnoDB COMMENT='用户信息表';
```
#### 2. 角色表 (system_roles)
```sql
CREATE TABLE `system_roles` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '角色ID',
`name` VARCHAR(30) NOT NULL COMMENT '角色名称',
`code` VARCHAR(100) NOT NULL COMMENT '角色权限字符串',
`sort` INT NOT NULL COMMENT '显示顺序',
`data_scope` TINYINT NOT NULL DEFAULT 1 COMMENT '数据范围1全部数据权限 2本部门及以下数据权限 3本部门数据权限 4仅本人数据权限',
`data_scope_dept_ids` VARCHAR(500) COMMENT '数据范围-部门数组',
`status` TINYINT NOT NULL COMMENT '角色状态0正常 1停用',
`type` TINYINT NOT NULL COMMENT '角色类型1系统内置 2自定义',
`remark` VARCHAR(500) COMMENT '备注',
`tenant_id` BIGINT NOT NULL COMMENT '租户 ID',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`creator` VARCHAR(64) COMMENT '创建人',
`updater` VARCHAR(64) COMMENT '更新人',
`deleted` BIT NOT NULL DEFAULT FALSE COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='角色信息表';
```
#### 3. 菜单表 (system_menu)
```sql
CREATE TABLE `system_menu` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '菜单ID',
`name` VARCHAR(50) NOT NULL COMMENT '菜单名称',
`permission` VARCHAR(100) NOT NULL COMMENT '权限标识',
`type` TINYINT NOT NULL COMMENT '菜单类型1目录 2菜单 3按钮',
`sort` INT NOT NULL DEFAULT 0 COMMENT '显示顺序',
`parent_id` BIGINT NOT NULL DEFAULT 0 COMMENT '父菜单ID',
`path` VARCHAR(200) COMMENT '路由地址',
`icon` VARCHAR(100) COMMENT '菜单图标',
`component` VARCHAR(255) COMMENT '组件路径',
`component_name` VARCHAR(255) COMMENT '组件名',
`status` TINYINT NOT NULL DEFAULT 0 COMMENT '菜单状态0正常 1停用',
`visible` BIT NOT NULL DEFAULT TRUE COMMENT '是否可见',
`keep_alive` BIT NOT NULL DEFAULT FALSE COMMENT '是否缓存',
`always_show` BIT NOT NULL DEFAULT FALSE COMMENT '是否总是显示',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`creator` VARCHAR(64) COMMENT '创建人',
`updater` VARCHAR(64) COMMENT '更新人',
`deleted` BIT NOT NULL DEFAULT FALSE COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='菜单权限表';
```
#### 4. 部门表 (system_dept)
```sql
CREATE TABLE `system_dept` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '部门id',
`parent_id` BIGINT NOT NULL DEFAULT 0 COMMENT '父部门id',
`name` VARCHAR(30) NOT NULL COMMENT '部门名称',
`sort` INT NOT NULL DEFAULT 0 COMMENT '显示顺序',
`leader_user_id` BIGINT COMMENT '负责人',
`phone` VARCHAR(11) COMMENT '联系电话',
`email` VARCHAR(64) COMMENT '邮箱',
`status` TINYINT NOT NULL COMMENT '部门状态0正常 1停用',
`tenant_id` BIGINT NOT NULL COMMENT '租户 ID',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`creator` VARCHAR(64) COMMENT '创建人',
`updater` VARCHAR(64) COMMENT '更新人',
`deleted` BIT NOT NULL DEFAULT FALSE COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='部门表';
```
#### 5. 字典表 (system_dict_type)
```sql
CREATE TABLE `system_dict_type` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '字典主键',
`name` VARCHAR(100) NOT NULL COMMENT '字典名称',
`type` VARCHAR(100) NOT NULL COMMENT '字典类型',
`status` TINYINT NOT NULL DEFAULT 0 COMMENT '状态0正常 1停用',
`remark` VARCHAR(500) COMMENT '备注',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`creator` VARCHAR(64) COMMENT '创建人',
`updater` VARCHAR(64) COMMENT '更新人',
`deleted` BIT NOT NULL DEFAULT FALSE COMMENT '是否删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_type` (`type`, `update_time`, `deleted`)
) ENGINE=InnoDB COMMENT='字典类型表';
```
### 基础设施模块
#### 6. 代码生成表 (infra_codegen_column)
```sql
CREATE TABLE `infra_codegen_column` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '编号',
`table_id` BIGINT NOT NULL COMMENT '表编号',
`column_name` VARCHAR(200) NOT NULL COMMENT '字段名',
`data_type` VARCHAR(100) NOT NULL COMMENT '字段类型',
`column_comment` VARCHAR(500) COMMENT '字段描述',
`nullable` BIT NOT NULL COMMENT '是否允许为空',
`pk` BIT NOT NULL COMMENT '是否主键',
`ordinal_position` INT NOT NULL COMMENT '排序',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`creator` VARCHAR(64) COMMENT '创建人',
`updater` VARCHAR(64) COMMENT '更新人',
`deleted` BIT NOT NULL DEFAULT FALSE COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='代码生成字段表';
```
#### 7. 定时任务表 (infra_job)
```sql
CREATE TABLE `infra_job` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '任务ID',
`name` VARCHAR(200) NOT NULL COMMENT '任务名称',
`status` TINYINT NOT NULL COMMENT '任务状态',
`handler_name` VARCHAR(200) NOT NULL COMMENT '处理器的名字',
`handler_param` VARCHAR(500) COMMENT '处理器的参数',
`cron_expression` VARCHAR(100) NOT NULL COMMENT 'Cron 表达式',
`retry_count` INT NOT NULL DEFAULT 0 COMMENT '重试次数',
`retry_interval` INT NOT NULL DEFAULT 0 COMMENT '重试间隔',
`monitor_timeout` INT NOT NULL DEFAULT 0 COMMENT '监控超时时间',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`creator` VARCHAR(64) COMMENT '创建人',
`updater` VARCHAR(64) COMMENT '更新人',
`deleted` BIT NOT NULL DEFAULT FALSE COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='定时任务表';
```
### 工作流模块
#### 8. 流程实例表 (bpm_process_instance)
```sql
CREATE TABLE `bpm_process_instance` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '编号',
`process_definition_id` VARCHAR(64) NOT NULL COMMENT '流程定义的编号',
`process_instance_id` VARCHAR(64) NOT NULL COMMENT '流程实例的编号',
`start_user_id` BIGINT NOT NULL COMMENT '发起人的用户编号',
`name` VARCHAR(255) COMMENT '流程实例的名字',
`business_key` VARCHAR(64) COMMENT '业务标识',
`status` TINYINT NOT NULL COMMENT '流程实例的状态',
`tenant_id` BIGINT NOT NULL COMMENT '租户 ID',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`creator` VARCHAR(64) COMMENT '创建人',
`updater` VARCHAR(64) COMMENT '更新人',
`deleted` BIT NOT NULL DEFAULT FALSE COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='流程实例表';
```
### 商城模块
#### 9. 商品表 (mall_product)
```sql
CREATE TABLE `mall_product` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '商品编号',
`name` VARCHAR(200) NOT NULL COMMENT '商品名称',
`sell_point` VARCHAR(500) COMMENT '卖点',
`description` VARCHAR(2000) COMMENT '商品详情',
`category_id` BIGINT NOT NULL COMMENT '分类编号',
`brand_id` BIGINT COMMENT '品牌编号',
`price` BIGINT NOT NULL COMMENT '价格,单位:分',
`stock` INT NOT NULL COMMENT '库存',
`pic_url` VARCHAR(500) COMMENT '商品主图',
`status` TINYINT NOT NULL COMMENT '商品状态',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`creator` VARCHAR(64) COMMENT '创建人',
`updater` VARCHAR(64) COMMENT '更新人',
`deleted` BIT NOT NULL DEFAULT FALSE COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='商品表';
```
#### 10. 订单表 (mall_order)
```sql
CREATE TABLE `mall_order` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '订单编号',
`user_id` BIGINT NOT NULL COMMENT '用户编号',
`order_no` VARCHAR(64) NOT NULL COMMENT '订单号',
`total_price` BIGINT NOT NULL COMMENT '订单总价,单位:分',
`status` TINYINT NOT NULL COMMENT '订单状态',
`pay_time` DATETIME COMMENT '付款时间',
`delivery_time` DATETIME COMMENT '发货时间',
`receiver_time` DATETIME COMMENT '收货时间',
`comment_time` DATETIME COMMENT '评论时间',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`creator` VARCHAR(64) COMMENT '创建人',
`updater` VARCHAR(64) COMMENT '更新人',
`deleted` BIT NOT NULL DEFAULT FALSE COMMENT '是否删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_order_no` (`order_no`)
) ENGINE=InnoDB COMMENT='订单表';
```
---
## 索引设计
### 索引类型
#### 1. 主键索引 (PRIMARY KEY)
每张表都有主键索引:
```sql
PRIMARY KEY (`id`)
```
#### 2. 唯一索引 (UNIQUE)
用于保证字段的唯一性:
```sql
UNIQUE KEY `uniq_username` (`username`, `update_time`, `tenant_id`, `deleted`)
```
#### 3. 普通索引 (INDEX)
用于提升查询性能:
```sql
KEY `idx_dept_id` (`dept_id`)
```
#### 4. 联合索引
用于多字段查询:
```sql
KEY `idx_user_id_status` (`user_id`, `status`)
```
### 索引规范
1. **主键索引**: 使用自增 BIGINT
2. **唯一索引**: 业务唯一字段
3. **普通索引**: 频繁查询的字段
4. **联合索引**: 多字段组合查询,遵循最左前缀原则
5. **索引数量**: 单表索引不超过 5 个
### 索引示例
```sql
-- 用户表索引
PRIMARY KEY (`id`)
UNIQUE KEY `uniq_username` (`username`, `update_time`, `tenant_id`, `deleted`)
KEY `idx_dept_id` (`dept_id`)
KEY `idx_status` (`status`)
-- 订单表索引
PRIMARY KEY (`id`)
UNIQUE KEY `uniq_order_no` (`order_no`)
KEY `idx_user_id` (`user_id`)
KEY `idx_status` (`status`)
KEY `idx_create_time` (`create_time`)
```
---
## 数据字典
### 通用数据字典
#### 1. 用户性别 (system_user_sex)
| 字典值 | 字典标签 | 颜色 |
|--------|----------|------|
| 1 | 男 | blue |
| 2 | 女 | pink |
| 3 | 未知 | gray |
#### 2. 用户状态 (system_common_status)
| 字典值 | 字典标签 | 颜色 |
|--------|----------|------|
| 0 | 启用 | success |
| 1 | 停用 | danger |
#### 3. 菜单类型 (system_menu_type)
| 字典值 | 字典标签 | 颜色 |
|--------|----------|------|
| 1 | 目录 | |
| 2 | 菜单 | |
| 3 | 按钮 | |
#### 4. 数据范围 (system_data_scope)
| 字典值 | 字典标签 |
|--------|----------|
| 1 | 全部数据权限 |
| 2 | 本部门及以下数据权限 |
| 3 | 本部门数据权限 |
| 4 | 仅本人数据权限 |
#### 5. 流程实例状态 (bpm_process_instance_status)
| 字典值 | 字典标签 | 颜色 |
|--------|----------|------|
| 1 | 进行中 | primary |
| 2 | 已结束 | success |
---
## 多租户设计
### 租户隔离策略
#### 1. 共享数据库、共享 Schema
所有租户共享同一个数据库,通过 `tenant_id` 字段隔离。
#### 2. 自动过滤
MyBatis Plus 拦截器自动添加租户条件:
```java
// 查询时自动添加租户条件
List<UserDO> users = userMapper.selectList();
// 实际 SQL
SELECT * FROM system_users
WHERE deleted = 0
AND tenant_id = 1
```
### 租户表设计
#### 租户表 (system_tenant)
```sql
CREATE TABLE `system_tenant` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '租户编号',
`name` VARCHAR(30) NOT NULL COMMENT '租户名',
`contact_user_id` BIGINT NOT NULL COMMENT '联系人的用户编号',
`contact_name` VARCHAR(30) NOT NULL COMMENT '联系人',
`contact_mobile` VARCHAR(11) COMMENT '联系手机',
`status` TINYINT NOT NULL COMMENT '租户状态',
`website` VARCHAR(256) COMMENT '绑定域名',
`package_id` BIGINT NOT NULL COMMENT '租户套餐编号',
`expire_time` DATETIME NOT NULL COMMENT '过期时间',
`account_count` INT NOT NULL COMMENT '账号数量',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`creator` VARCHAR(64) COMMENT '创建人',
`updater` VARCHAR(64) COMMENT '更新人',
`deleted` BIT NOT NULL DEFAULT FALSE COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='租户表';
```
#### 租户套餐表 (system_tenant_package)
```sql
CREATE TABLE `system_tenant_package` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '套餐编号',
`name` VARCHAR(30) NOT NULL COMMENT '套餐名',
`status` TINYINT NOT NULL COMMENT '套餐状态',
`remark` VARCHAR(500) COMMENT '备注',
`menu_ids` VARCHAR(500) NOT NULL COMMENT '关联的菜单编号',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`creator` VARCHAR(64) COMMENT '创建人',
`updater` VARCHAR(64) COMMENT '更新人',
`deleted` BIT NOT NULL DEFAULT FALSE COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='租户套餐表';
```
---
## 数据库优化
### SQL 优化
#### 1. 避免全表扫描
```sql
-- 不推荐
SELECT * FROM system_users
-- 推荐
SELECT id, username, nickname FROM system_users
```
#### 2. 使用索引
```sql
-- 不推荐
SELECT * FROM system_users WHERE SUBSTRING(username, 1, 3) = 'adm'
-- 推荐
SELECT * FROM system_users WHERE username LIKE 'adm%'
```
#### 3. 分页查询
```sql
-- 使用分页插件
SELECT * FROM system_users
LIMIT 10 OFFSET 0
```
### 表结构优化
#### 1. 字段类型选择
```sql
-- 不推荐
VARCHAR(1000) -- 过长
-- 推荐
VARCHAR(200) -- 合理长度
```
#### 2. 字段数量控制
单表字段数量不超过 50 个。
#### 3. 表分区
大表可以采用分区策略:
```sql
-- 按时间分区
CREATE TABLE `system_operate_log` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`create_time` DATETIME NOT NULL,
PRIMARY KEY (`id`, `create_time`)
) ENGINE=InnoDB
PARTITION BY RANGE (TO_DAYS(create_time)) (
PARTITION p202301 VALUES LESS THAN (TO_DAYS('2023-02-01')),
PARTITION p202302 VALUES LESS THAN (TO_DAYS('2023-03-01'))
);
```
---
## 数据库管理
### 数据库备份
#### 1. 逻辑备份
```bash
# 备份
mysqldump -u root -p lyzsys > lyzsys_backup.sql
# 恢复
mysql -u root -p lyzsys < lyzsys_backup.sql
```
#### 2. 物理备份
```bash
# 复制数据文件
cp -r /var/lib/mysql/lyzsys /backup/lyzsys
```
### 数据库监控
#### 1. 慢查询日志
```sql
-- 开启慢查询日志
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;
```
#### 2. 性能监控
```sql
-- 查看连接数
SHOW PROCESSLIST;
-- 查看状态
SHOW STATUS;
```
### 数据库维护
#### 1. 表优化
```sql
-- 优化表
OPTIMIZE TABLE system_users;
-- 分析表
ANALYZE TABLE system_users;
-- 修复表
REPAIR TABLE system_users;
```
#### 2. 索引优化
```sql
-- 查看索引使用情况
SHOW INDEX FROM system_users;
-- 删除无用索引
DROP INDEX idx_unused ON system_users;
```
---
**文档版本**: v1.0.0
**最后更新**: 2025-01-19
**维护团队**: Lyzsys 数据库团队