🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## innodb引擎 大于等于5.5 版本中默认的存储引擎,MySql推荐使用的存储引擎。提供事务,行级锁定,外键约束的存储引擎。 事务安全型存储引擎,更加注重数据的完整性和安全性。 ### 存储格式 innodb存储引擎 : **每个数据表**有单独的“结构文件” *.frm ; 数据,索引集中存储,存储于同一个**表空间文件**中ibdata1。 ![](https://box.kancloud.cn/464dedf94801a3089f87d6bc0d63edd5_773x184.png) ![](https://box.kancloud.cn/6eb15c77f6421bce9df6b9f29fc3b62d_995x673.png) 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后期无论发生任何变化,在开启下创建的表都有自己独立的“数据/索引”文件。 ![](https://box.kancloud.cn/3499a406313cea12fdb2d8e23daab9a8_816x192.png) #### 注意 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:默认情况,表锁和行锁都是自动获得的,不需要额外的命令。**