## 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查詢優化
- 數據庫的分庫分表
- 數據庫監控