## InnoDB
* MySQL5.5.8及以后的版本默认存储引擎
* Innodb 使用表空间进行数据存储
```
innodb_file_per_table 参数
ON:独立表空间:tablename .ibd
OFF:系统表空间: ibdataX
```
* 系统表和独立表空间要如何选择
> 比较:
>
> 系统表空间无法简单的收缩文件大小
> 独立表空间可以通过optimeize table命令收缩系统文件
>
> 系统表空间会产生IO瓶颈
> 独立表空间可以同时向多个文件刷新数据
> 建议:
> 对InnoDB使用独立表空间(5.6之后是默认配置)
## 把原来存在于系统表空间中的表转移到独立表空间的方法
1. 使用mysqldump导出所有数据库表数据.
2. 停止MySQL服务,修改参数,并删除InnoDB相关文件.
3. 重启MySQL服务,重建Innodb系统表空间.
4. 重新导入数据.
## innodb存储引擎特性
1. innodb是一种事务性存储引擎;
2. 完全支持事务的ACID特性;
3. 使用Redo log 和 Undo log这两种日志完成事务的特性;
4. Redo log完成事务的持久性;
5. Undo log是完成回滚操作和mvcc多版本并发控制;
6. redo log存储的是已提交的事务,而undo log存储的是未提交的事务;
7. innodb支持行级锁;
8. 行级锁可以做大程度的支持并发;
9. 行级锁是由存储引擎层实现的(MySQL完全不了解存储引擎内部完成方式);
## 查看redo log缓冲区
每一秒刷新到磁盘上.
```
mysql> show variables like 'innodb_log_buffer_size';
+------------------------+----------+
| Variable_name | Value |
+------------------------+----------+
| innodb_log_buffer_size | 16777216 |
+------------------------+----------+
1 row in set (0.00 sec)
```
## 什么是锁
1. 锁对主要作用是管理共享资源的并发访问;
2. 锁用于实现事务的隔离性(redo log和undo log完成了原子性,持久性,一致性);
## 锁的粒度
1. 表级锁(开销小,并发低);
2. 行级锁(开销大,并发高);
## 阻塞
1. 两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象;
2. 阻塞是为了确保事务可以并发且正常运行;
3. 过多的阻塞会使得连接堆积,占用大量的请求资源,使得系统性能大幅下降;
## 死锁
1. 两个或两个以上的事务在执行过程中,互相占用了对方等待的资源而产生的资源;
2. 因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等的进程称为死锁进程;
## Innodb状态检查
```
show engine innodb status\G
```
#### 适用场景
* Innodb适合于大多数的OLTP应用
* 5.7版本之后支持全文索引和空间函数
- 实例和故事
- 大表
- 大事务
- 什么影响了MySQL性能
- 影响性能的几个方面
- CPU资源和可用内存大小
- 磁盘的配置和选择
- centos系统参数优化
- 文件系统对性能的影响
- MySQL体系结构
- 概述
- myisma
- innodb
- csv
- archive
- memory
- MySQL服务器参数
- 概述
- 内存配置相关参数
- IO相关参数配置
- 安全相关配置参数
- 其他常用配置参数
- 数据库设计对性能的影响
- 总结
- MySQL基准测试
- 基准测试
- 如何进行基准测试
- 基准测试实例
- 基准测试工具之mysqlslap
- 基准测试工具之sysbench
- MySQL数据库结构优化
- MySQL高可用架构设计
- 数据库索引优化
- SQL查询优化
- 数据库的分库分表
- 数据库监控