# 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 数据库团队
