## 数据库设计和OOAD

### 存储引擎

1. InnoDB
2. MyISAM

### 数据类型

### 索引

#### 索引的类型

1. B-Tree索引
2. HASH索引
3. R-Tree索引（空间索引）
4. Full-text索引（全文索引）

### 视图

查询的快照，可以将访问权限控制到列上。

```SQL
create view ... as select ...
drop view ...
```

### 存储过程

```SQL
create procedure ... (params)
begin
...
end;

call ...
```

```Python
cursor.callproc('...')
```

### 触发器

不能用，因为多个行锁可能直接升级为表锁，导致性能低下。

### 事务控制

### SQL注入攻击

### 数据分区

### SQL优化

#### 优化步骤

1. 通过`show status`了解各种SQL的执行频率。

   ```SQL
   show status like 'com_%';
   show status like 'innodb_%';
   show status like 'connections';
   show status like 'slow_queries';
   ```

2. 定位低效率的SQL语句 - 慢查询日志。

   ```SQL
   show processlist
   ```

3. 通过`explain`了解SQL的执行计划。

   - select_type：查询类型（simple、primary、union、subquery）
   - table：输出结果集的表
   - type：访问类型（ALL、index、range、ref、eq_ref、const、NULL）
   - possible_keys：查询时可能用到的索引
   - key：实际使用的索引
   - key_len：索引字段的长度
   - rows：扫描的行数
   - extra：额外信息

4. 通过`show profiles`和`show profile for query`分析SQL。

#### SQL优化

1. 优化insert语句
2. 优化order by语句
3. 优化group by语句
4. 优化嵌套查询
5. 优化or条件
6. 优化分页查询
7. 使用SQL提示
   - USE INDEX
   - IGNORE INDEX
   - FORCE INDEX

#### 配置优化

1. 调整max_connections
2. 调整back_log
3. 调整table_open_cache
4. 调整thread_cache_size
5. 调整innodb_lock_wait_timeout

#### 架构优化

1. 通过拆分提高表的访问效率
   - 垂直拆分
   - 水平拆分
2. 逆范式理论
   - 数据表设计的规范程度称之为范式（Normal Form）
     - 1NF：列不能再拆分
     - 2NF：所有的属性都依赖于主键
     - 3NF：所有的属性都直接依赖于主键（消除传递依赖）
     - BCNF：消除非平凡多值依赖
3. 使用中间表提高统计查询速度

### 数据备份

#### 导入和导出

1. select ... into outfile ...
2. load data infile ... into table ...
3. mysqldump
4. mysqlimport

#### ibbackup工具

#### xtrabackup工具

### 主从复制

### 集群

