## 將字段很多的表分解成多個表
對于字段較多的表,可以將這些數據分離出來形成新表.因為當一個表的數據量很大時,會由于使用頻率低的字段的存在而變低.
假設會員信息表存儲會員登錄認證信息,該表中有很多字段,如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操作
- 連接
- 創建數據庫
- 插入數據
- 插入多條數據
- 預處理語句
- 查詢數據
- 預處理語句
- 實戰應用
- 分表