## innodb引擎
大于等于5.5 版本中默认的存储引擎,MySql推荐使用的存储引擎。提供事务,行级锁定,外键约束的存储引擎。
事务安全型存储引擎,更加注重数据的完整性和安全性。
### 存储格式
innodb存储引擎 : **每个数据表**有单独的“结构文件” *.frm ;
数据,索引集中存储,存储于同一个**表空间文件**中ibdata1。


innodb表空间文件:存储innodb的数据和索引。
默认情况下,所有的 innodb表的数据和索引在同一个表空间文件中,**通过配置可以达到每个innodb的表对应一个表空间文件**。
语法:
~~~
show variables like "innodb_file_per_table";
~~~
~~~
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | OFF |
+-----------------------+-------+
~~~
开启该配置:
~~~
set global innodb_file_per_table=1;
~~~
~~~
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
~~~
系统配置参数innodb_file_per_table后期无论发生任何变化,在开启下创建的表都有自己独立的“数据/索引”文件。

#### 注意
innodb数据表不能直接进行文件的复制/粘贴进行备份还原,可以使用如下指令:
~~~
> mysqldump -uroot -p密码 数据库名称 > f:/文件名称.sql [备份]
~~~
~~~
> mysql -uroot -p密码 数据库 < f:/文件名称.sql [还原]
~~~
### 数据按照主键顺序存储
innodb数据表,数据的**写入顺序** 与 **存储的顺序**不一致,需要按照主键(**如何有主键的话**)的顺序把记录**摆放到**对应的位置上去,速度比Myisam的要**稍慢**。
创建一张表 :
~~~
create table test(
id int auto_increment primary key,
name varchar(20) not null,
);
~~~
插入数据
~~~
insert into test values(100,'1'),(50,'2'),(1,'3'),(1000,'4');
~~~
查看结果
~~~
+------+------+
| id | name |
+------+------+
| 1 | 3 |
| 50 | 2 |
| 100 | 1 |
| 1000 | 4 |
+------+------+
~~~
插入时做排序工作,效率低。
#### 并发处理
1. 擅长处理并发。
2. 行级锁定(row-level locking),实现了行级锁定,在一定情况下,可以选择行级锁来提升并发性,也支持表级锁定,innodb根据操作选择。
3. 多版本并发控制,MVCC,效果达到无阻塞读操作。
#### 锁机制
当客户端操作表(记录)时,为了保证操作的隔离性(多个客户端操作不能相互影响),通过加锁来处理。
**操作 :**
**读锁** : 读操作时增加的锁,也叫共享锁,S-lock。特征是所有人都只可以读,只有释放锁之后才可以写。
**写锁**:写操作时增加的锁,也叫独占锁或排他锁,X-lock。特征,只有锁表的客户可以操作(读写)这个表,其他客户读都不能读。
**锁定粒度(范围)**
**表级锁**:开销小,加锁快,发生锁冲突的概率最高,并发度最低。myisam和innodb都支持。
**行级锁**:开销大,加锁慢,发生锁冲突的概率最低,并发度也最高。innodb支持
**Tips:默认情况,表锁和行锁都是自动获得的,不需要额外的命令。**
- MySQL优化概述
- 存储引擎的选择
- innodb引擎
- myisam引擎
- memory引擎
- 查询需优化语句
- 通用查询日志
- 慢查询日志
- profile机制
- 索引
- 索引基本介绍
- 索引类型
- 索引管理语法
- 创建索引主要事项
- 执行计划
- 查看索引类型
- myisam索引数据结构
- innodb索引数据结构
- 索引覆盖
- 索引使用原则
- 列独立
- like查询
- 复合索引使用
- or运算都具有索引
- mysql智能选择
- 优化group by语句
- 前缀索引
- 全文索引
- 查询缓存
- 查询缓存操作
- 无缓存
- limit分页优化
- 分区
- 分区介绍
- list分区
- range分区
- hash分区
- key(键值)分区
- 分区管理
- 分表
- 分表介绍
- 水平分表
- 垂直分表
- MySQL锁机制
- 锁机制介绍
- 锁的几种形式
- 表锁操作
- 行锁操作
- 数据碎片与维护
- 范式
- 第一范式
- 第二范式
- 第三范式
- 反三范式
- 主从复制
- 介绍
- 读写分离