## 将字段很多的表分解成多个表
对于字段较多的表,可以将这些数据分离出来形成新表.因为当一个表的数据量很大时,会由于使用频率低的字段的存在而变低.
假设会员信息表存储会员登录认证信息,该表中有很多字段,如id/姓名/密码/地址/电话/个人描述等....其中地址,电话,个人描述等字段并不常用,可以分离出来形成新的表.
### 创建表
```sql
create table user1 (
id ini(11) not null auto_increment,
...
primary key (id)
);
create table user2 (
id int(11) not null default 0,
...
)
```
### 数据操作思路
#### 插入数据
先插入user1表数据,然后拿到id,然后再将剩余的数据和id插入user2表中
#### 查询数据
```sql
select * from user1 left join user2 on user1.id = user2.id;
```
#### 删除数据
可以使用触发器
## 添加中间表
对于需要经常联合查询的表,可以建立中间表以提高上查询效率.通过建立中间表,把需要经常联合查询的数据插入到中间表中,然后将原来的联合查询改为对中间表的查询,以此来提高查询效率.
## 增加冗余字段
按照范式原则应该减少冗余字段,但是,合理地增加冗余字段可以提高查询速度.
表的规范化越高,表与表之间的关系就越多,需要连接查询的情况也就越多.
## 优化插入记录的速度
插入数据时,影响插入速度的主要是索引/唯一索引的校验/一次插入数据的条数.
### 插入多条语句
如果插入大量数据,建立索引会降低插入记录的速度,回了解决这种情况,可以在插入前禁用索引,数据插入完毕后再开启索引.
> 对于空表批量导入数据,则不需要进行次操作,因为MyISAM引擎的表是在导入数据之后才建立的
#### 禁用索引
```sql
alter table 表名 disable keys;
```
#### 重新启用索引
```sql
alter table 表名 enable keys;
```
### 禁用唯一性检验
插入数据时,MySQL会对插入的记录进行唯一性校验.这种唯一性校验也会降低插入记录的速度,为了降低这种情况对速度的影响,可以在插入记录前禁用唯一性检验,等到记录插入完毕后再开启.
#### 禁用唯一性校验
```sql
set unique_checks = 0;
```
#### 开启唯一性校验
```sql
set unique_checks = 1;
```
### 使用批量插入
插入多条语句记录时,可以使用一条一条插入,也可以使用一次插入多条,一次插入多条的速度会快过一条一条插入
### InnoDB表优化
#### 禁用唯一性校验
##### 关闭
```sql
set unique_checks = 0;
```
##### 开启
```sql
set unique_checks = 1;
```
#### 禁用外键检查
##### 关闭
```sql
set foreign_key_checks = 0;
```
##### 开启
```sql
set foreign_key_checks = 1;
```
#### 禁止自动提交
##### 关闭
```sql
set autocommit = 0;
```
##### 开启
```sql
set autocommit = 1;
```
## 分析表/检查表/优化表
### 分析表
主要分析关键字的分布
```sql
analyze [local | no_write_to_binlog] table 表 [,表2...];
```
local是no_write_to_binlog关键词的别名,表示不写入二进制日志
结果信息解释
|参数|说明|
|-|-|
|Table|表示分析的表的名称|
|Op|表示执行的操作,analyze表示进行分析操作|
|Msg_type|表示信息类型: 状态status/信息(info)/注意(note)/警告warning/错误(error)|
|Msg_text|显示信息|
### 检查表
主要检查表是否存在错误
> option只对MyISAM类型的表有效,执行过程中会加上只读锁
```sql
check table 表名 [,表名...] option = {quick|fast|medium|extended|changed} [option...]...
```
|参数|说明|
|quick|不扫描行|
|fast|只检查没有被正确关闭的表|
|medium|扫描行|
|extended|对每行的所有关键字进行全面查找|
|changed|只检查上次检查后被更改的表|
### 优化表
主要是删除或者更新造成的空间浪费
> 对InnoDB和MyISAM类型都有效,但是只能优化表中的varchar/blob或text类新的字段
```sql
optimize [local|no_write_to_binlog] table 表名 [,表名...];
```
local是no_write_to_binlog关键词的别名,表示不写入二进制日志
- 简介
- 数据库
- 数据表
- 创建数据表
- 查看数据表结构
- 修改数据表
- 删除数据表
- 查询数据
- 表单查询
- 聚合查询
- 链接查询
- 子查询
- 联合查询
- 正则查询
- 数据管理
- 数据类型
- 添加数据
- 更新数据
- 删除数据
- 索引
- 索引分类
- 设计原则
- 添加索引
- 查看索引
- 删除索引
- 视图
- 视图操作
- 视图应用
- 事务
- 触发器
- 存储过程和函数
- 变量
- 异常处理
- 光标
- 流程控制
- 存储过程
- 自定义函数
- 内置函数
- 数学
- 字符串
- 日期和时间
- 条件判断
- 系统信息
- 加/解密
- 其他
- 用户管理
- 登录和退出
- 新建用户
- 删除用户
- 修改用户
- 找回ROOT密码
- 权限管理
- 备份恢复
- 备份数据
- 恢复数据
- 日志
- 二进制日志
- 错误日志
- 查询日志
- 慢查询日志
- 性能优化
- 优化查询语句
- 优化数据库结构
- 优化服务器
- 主从复制
- WIN系统主从复制
- Linux单机主从复制
- Linux联机主从复制
- 参数配置
- 日常管理和维护
- 切换主从服务器
- PHP操作
- 连接
- 创建数据库
- 插入数据
- 插入多条数据
- 预处理语句
- 查询数据
- 预处理语句
- 实战应用
- 分表